Merge branch 'next' into clock-docs

This commit is contained in:
Franck Nijhof 2025-03-27 23:29:21 +01:00 committed by GitHub
commit 399b44cb9d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
1574 changed files with 62138 additions and 16506 deletions

View File

@ -11,7 +11,7 @@ jobs:
pull-requests: write
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v9.0.0
- uses: actions/stale@v9.1.0
if: ${{ github.repository_owner == 'home-assistant' }}
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}

View File

@ -8,9 +8,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out files from GitHub
uses: actions/checkout@v4.1.7
uses: actions/checkout@v4.2.2
- name: Setting up Node.js
uses: actions/setup-node@v4.0.4
uses: actions/setup-node@v4.3.0
with:
node-version: 20
cache: "npm"
@ -25,9 +25,9 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Check out files from GitHub
uses: actions/checkout@v4.1.7
uses: actions/checkout@v4.2.2
- name: Setting up Node.js
uses: actions/setup-node@v4.0.4
uses: actions/setup-node@v4.3.0
with:
node-version: 20
cache: "npm"

View File

@ -10,11 +10,13 @@
# Pages
source/_integrations/3_day_blinds.markdown @starkillerOG
source/_integrations/abode.markdown @shred86
source/_integrations/acaia.markdown @zweckj
source/_integrations/accuweather.markdown @bieniu
source/_integrations/acmeda.markdown @atmurray
source/_integrations/acomax.markdown @starkillerOG
source/_integrations/adax.markdown @danielhiversen
source/_integrations/adguard.markdown @frenck
source/_integrations/ads.markdown @mrpasztoradam
source/_integrations/advantage_air.markdown @Bre77
source/_integrations/aemet.markdown @Noltari
source/_integrations/aep_ohio.markdown @tronikos
@ -51,6 +53,7 @@ source/_integrations/androidtv.markdown @JeffLIrion @ollo69
source/_integrations/androidtv_remote.markdown @tronikos @Drafteed
source/_integrations/anova.markdown @Lash-L
source/_integrations/anthemav.markdown @hyralex
source/_integrations/anthropic.markdown @Shulyaka
source/_integrations/anwb_energie.markdown @klaasnicolaas
source/_integrations/aosmith.markdown @bdr99
source/_integrations/apache_kafka.markdown @bachya
@ -62,6 +65,7 @@ source/_integrations/application_credentials.markdown @home-assistant/core
source/_integrations/apprise.markdown @caronc
source/_integrations/aprilaire.markdown @chamberlain2007
source/_integrations/aprs.markdown @PhilRW
source/_integrations/aps.markdown @tronikos
source/_integrations/apsystems.markdown @mawoka-myblock @SonnenladenGmbH
source/_integrations/aquacell.markdown @Jordi1990
source/_integrations/aranet.markdown @aschmitz @thecode @anrijs
@ -70,6 +74,7 @@ source/_integrations/arris_tg2492lg.markdown @vanbalken
source/_integrations/arve.markdown @ikalnyi
source/_integrations/aseko_pool_live.markdown @milanmeu
source/_integrations/assist_pipeline.markdown @balloob @synesthesiam
source/_integrations/assist_satellite.markdown @home-assistant/core @synesthesiam
source/_integrations/asuswrt.markdown @kennedyshead @ollo69
source/_integrations/atag.markdown @MatsNL
source/_integrations/aten_pe.markdown @mtdcr
@ -90,6 +95,7 @@ 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
source/_integrations/azure_storage.markdown @zweckj
source/_integrations/backup.markdown @home-assistant/core
source/_integrations/baf.markdown @bdraco @jfroy
source/_integrations/balboa.markdown @garbled1 @natekspencer
@ -112,7 +118,7 @@ source/_integrations/bluetooth_adapters.markdown @bdraco
source/_integrations/bmw_connected_drive.markdown @gerard33 @rikroe
source/_integrations/bond.markdown @bdraco @prystupa @joshs85 @marciogranzotto
source/_integrations/bosch_shc.markdown @tschamm
source/_integrations/brandt.markdown @imicknl @vlebourl @tetienne @nyroDev @tronix117 @alexfp14
source/_integrations/brandt.markdown @imicknl
source/_integrations/braviatv.markdown @bieniu @Drafteed
source/_integrations/brel_home.markdown @starkillerOG
source/_integrations/bring.markdown @miaucl @tr4nt0r
@ -124,12 +130,14 @@ source/_integrations/bryant_evolution.markdown @danielsmyers
source/_integrations/bsblan.markdown @liudger
source/_integrations/bswitch.markdown @jafar-atili
source/_integrations/bt_smarthub.markdown @typhoon2099
source/_integrations/bthome.markdown @Ernst79
source/_integrations/bthome.markdown @Ernst79 @thecode
source/_integrations/bticino.markdown @cgtobi
source/_integrations/bubendorff.markdown @cgtobi
source/_integrations/buienradar.markdown @mjj4791 @ties @Robbie1221
source/_integrations/burbank_water_and_power.markdown @tronikos
source/_integrations/button.markdown @home-assistant/core
source/_integrations/calendar.markdown @home-assistant/core
source/_integrations/cambridge_audio.markdown @noahhusby
source/_integrations/camera.markdown @home-assistant/core
source/_integrations/cast.markdown @emontnemery
source/_integrations/ccm15.markdown @ocalvo
@ -155,11 +163,12 @@ source/_integrations/config.markdown @home-assistant/core
source/_integrations/configurator.markdown @home-assistant/core
source/_integrations/control4.markdown @lawtancool
source/_integrations/conversation.markdown @home-assistant/core @synesthesiam
source/_integrations/cookidoo.markdown @miaucl
source/_integrations/coolmaster.markdown @OnFreund
source/_integrations/counter.markdown @fabaff
source/_integrations/cover.markdown @home-assistant/core
source/_integrations/cover.template.markdown @home-assistant/core
source/_integrations/cozytouch.markdown @imicknl @vlebourl @tetienne @nyroDev @tronix117 @alexfp14
source/_integrations/cozytouch.markdown @imicknl
source/_integrations/cpuspeed.markdown @fabaff
source/_integrations/cribl.markdown @Bre77
source/_integrations/crownstone.markdown @Crownstone @RicArch97
@ -168,8 +177,10 @@ source/_integrations/dacia.markdown @epenet
source/_integrations/daikin.markdown @fredrike
source/_integrations/date.markdown @home-assistant/core
source/_integrations/datetime.markdown @home-assistant/core
source/_integrations/deako.markdown @sebirdman @balake @deakolights
source/_integrations/debugpy.markdown @frenck
source/_integrations/deconz.markdown @Kane610
source/_integrations/decorquip.markdown @starkillerOG
source/_integrations/default_config.markdown @home-assistant/core
source/_integrations/delijn.markdown @bollewolle @Emilv2
source/_integrations/delmarva.markdown @tronikos
@ -201,8 +212,9 @@ source/_integrations/dormakaba_dkey.markdown @emontnemery
source/_integrations/downloader.markdown @erwindouna
source/_integrations/dremel_3d_printer.markdown @tkdrob
source/_integrations/drop_connect.markdown @ChandlerSystems @pfrazer
source/_integrations/dsmr.markdown @Robbie1221 @frenck
source/_integrations/dsmr.markdown @Robbie1221
source/_integrations/dsmr_reader.markdown @sorted-bits @glodenox @erwindouna
source/_integrations/duke_energy.markdown @hunterjm
source/_integrations/duotecno.markdown @cereal2nd
source/_integrations/duquesne_light.markdown @tronikos
source/_integrations/dwd_weather_warnings.markdown @runningman84 @stephan192 @andarotajo
@ -215,8 +227,10 @@ source/_integrations/ecovacs.markdown @mib1185 @edenhaus @Augar
source/_integrations/ecowitt.markdown @pvizeli
source/_integrations/efergy.markdown @tkdrob
source/_integrations/egardia.markdown @jeroenterheerdt
source/_integrations/eheimdigital.markdown @autinerd
source/_integrations/electrasmart.markdown @jafar-atili
source/_integrations/electric_kiwi.markdown @mikey0000
source/_integrations/elevenlabs.markdown @sorgfresser
source/_integrations/elgato.markdown @frenck
source/_integrations/elkm1.markdown @gwww @bdraco
source/_integrations/elmax.markdown @albertogeniola
@ -268,7 +282,7 @@ source/_integrations/fitbit.markdown @allenporter
source/_integrations/fivem.markdown @Sander0542
source/_integrations/fjaraskupan.markdown @elupus
source/_integrations/flexit_bacnet.markdown @lellky @piotrbulinski
source/_integrations/flexom.markdown @imicknl @vlebourl @tetienne @nyroDev @tronix117 @alexfp14
source/_integrations/flexom.markdown @imicknl
source/_integrations/flick_electric.markdown @ZephireNZ
source/_integrations/flipr.markdown @cnico
source/_integrations/flo.markdown @dmulcahey
@ -280,13 +294,14 @@ source/_integrations/fortios.markdown @kimfrellsen
source/_integrations/foscam.markdown @krmarien
source/_integrations/freebox.markdown @hacf-fr @Quentame
source/_integrations/freedompro.markdown @stefano055415
source/_integrations/fritz.markdown @mammuth @AaronDavidSchneider @chemelli74 @mib1185
source/_integrations/fritz.markdown @AaronDavidSchneider @chemelli74 @mib1185
source/_integrations/fritzbox.markdown @mib1185 @flabbamann
source/_integrations/fritzbox_callmonitor.markdown @cdce8p
source/_integrations/fronius.markdown @farmio
source/_integrations/frontend.markdown @home-assistant/frontend
source/_integrations/frontier_silicon.markdown @wlcrs
source/_integrations/fujitsu_anywair.markdown @Bre77
source/_integrations/fujitsu_fglair.markdown @crevetor
source/_integrations/fully_kiosk.markdown @cgarwood
source/_integrations/fyta.markdown @dontinelli
source/_integrations/garages_amsterdam.markdown @klaasnicolaas
@ -305,37 +320,42 @@ source/_integrations/geonetnz_volcano.markdown @exxamalte
source/_integrations/gios.markdown @bieniu
source/_integrations/github.markdown @timmo001 @ludeeus
source/_integrations/glances.markdown @engrbm87
source/_integrations/go2rtc.markdown @home-assistant/core
source/_integrations/goalzero.markdown @tkdrob
source/_integrations/gogogate2.markdown @vangorra
source/_integrations/goodwe.markdown @mletenay @starkillerOG
source/_integrations/google.markdown @allenporter
source/_integrations/google_assistant.markdown @home-assistant/cloud
source/_integrations/google_assistant_sdk.markdown @tronikos
source/_integrations/google_cloud.markdown @lufton
source/_integrations/google_cloud.markdown @lufton @tronikos
source/_integrations/google_drive.markdown @tronikos
source/_integrations/google_generative_ai_conversation.markdown @tronikos
source/_integrations/google_mail.markdown @tkdrob
source/_integrations/google_photos.markdown @allenporter
source/_integrations/google_sheets.markdown @tkdrob
source/_integrations/google_tasks.markdown @allenporter
source/_integrations/google_travel_time.markdown @eifinger
source/_integrations/govee_ble.markdown @bdraco @PierreAronnax
source/_integrations/govee_ble.markdown @bdraco
source/_integrations/govee_light_local.markdown @Galorhallen
source/_integrations/gpsd.markdown @fabaff @jrieger
source/_integrations/gree.markdown @cmroche
source/_integrations/greeneye_monitor.markdown @jkeljo
source/_integrations/group.markdown @home-assistant/core
source/_integrations/guardian.markdown @bachya
source/_integrations/habitica.markdown @ASMfreaK @leikoilja @tr4nt0r
source/_integrations/habitica.markdown @tr4nt0r
source/_integrations/hardware.markdown @home-assistant/core
source/_integrations/harmony.markdown @ehendrix23 @bdraco @mkeesey @Aohzan
source/_integrations/harvey.markdown @Jordi1990
source/_integrations/hassio.markdown @home-assistant/supervisor
source/_integrations/havana_shade.markdown @starkillerOG
source/_integrations/hdmi_cec.markdown @inytar
source/_integrations/heatmiser.markdown @andylockran
source/_integrations/heicko.markdown @starkillerOG
source/_integrations/heiwa.markdown @cmroche
source/_integrations/heos.markdown @andrewsayre
source/_integrations/here_travel_time.markdown @eifinger
source/_integrations/hexaom.markdown @imicknl @vlebourl @tetienne @nyroDev @tronix117 @alexfp14
source/_integrations/hi_kumo.markdown @imicknl @vlebourl @tetienne @nyroDev @tronix117 @alexfp14
source/_integrations/hexaom.markdown @imicknl
source/_integrations/hi_kumo.markdown @imicknl
source/_integrations/hikvision.markdown @mezz64
source/_integrations/hikvisioncam.markdown @fbradyirl
source/_integrations/hisense_aehw4a1.markdown @bannhead
@ -344,7 +364,7 @@ source/_integrations/hive.markdown @Rendili @KJonline
source/_integrations/hko.markdown @MisterCommand
source/_integrations/hlk_sw16.markdown @jameshilliard
source/_integrations/holiday.markdown @jrieger @gjohansson-ST
source/_integrations/home_connect.markdown @DavidMStraub
source/_integrations/home_connect.markdown @DavidMStraub @Diegorro98 @MartinHjelmare
source/_integrations/home_plus_control.markdown @cgtobi
source/_integrations/homeassistant.markdown @home-assistant/core
source/_integrations/homeassistant_alerts.markdown @home-assistant/core
@ -352,12 +372,14 @@ source/_integrations/homeassistant_green.markdown @home-assistant/core
source/_integrations/homeassistant_hardware.markdown @home-assistant/core
source/_integrations/homeassistant_sky_connect.markdown @home-assistant/core
source/_integrations/homeassistant_yellow.markdown @home-assistant/core
source/_integrations/homee.markdown @Taraman17
source/_integrations/homekit.markdown @bdraco
source/_integrations/homekit_controller.markdown @Jc2k @bdraco
source/_integrations/homematic.markdown @pvizeli
source/_integrations/homematicip_cloud.markdown @hahn-th
source/_integrations/homewizard.markdown @DCSBL
source/_integrations/honeywell.markdown @rdfurman @mkmer
source/_integrations/html5.markdown @alexyao2015
source/_integrations/http.markdown @home-assistant/core
source/_integrations/huawei_lte.markdown @scop @fphammerle
source/_integrations/hue.markdown @balloob @marcelveldt
@ -366,6 +388,7 @@ source/_integrations/humidifier.markdown @home-assistant/core @Shulyaka
source/_integrations/hunterdouglas_powerview.markdown @bdraco @kingy444 @trullock
source/_integrations/hurrican_shutters_wholesale.markdown @starkillerOG
source/_integrations/husqvarna_automower.markdown @Thomas55555
source/_integrations/husqvarna_automower_ble.markdown @alistair23
source/_integrations/huum.markdown @frwickst
source/_integrations/hvv_departures.markdown @vigonotion
source/_integrations/hydrawise.markdown @dknowles2 @thomaskistler @ptcryan
@ -373,9 +396,9 @@ source/_integrations/hyperion.markdown @dermotduffy
source/_integrations/ialarm.markdown @RyuzakiKK
source/_integrations/iammeter.markdown @lewei50
source/_integrations/iaqualink.markdown @flz
source/_integrations/ibeacon.markdown @bdraco
source/_integrations/icloud.markdown @Quentame @nzapponi
source/_integrations/idasen_desk.markdown @abmantis
source/_integrations/igloohome.markdown @keithle888
source/_integrations/ign_sismologia.markdown @exxamalte
source/_integrations/image.markdown @home-assistant/core
source/_integrations/image_processing.markdown @home-assistant/core
@ -398,23 +421,26 @@ source/_integrations/insteon.markdown @teharris1
source/_integrations/integration.markdown @dgomes
source/_integrations/intellifire.markdown @jeeftor
source/_integrations/intesishome.markdown @jnimmo
source/_integrations/iometer.markdown @MaestroOnICe
source/_integrations/ios.markdown @robbiet480
source/_integrations/iotawatt.markdown @gtdiehl @jyavenard
source/_integrations/iotty.markdown @pburgio
source/_integrations/iotty.markdown @shapournemati-iotty
source/_integrations/iperf3.markdown @rohankapoorcom
source/_integrations/ipma.markdown @dgomes
source/_integrations/iqvia.markdown @bachya
source/_integrations/irish_rail_transport.markdown @ttroy50
source/_integrations/iron_os.markdown @tr4nt0r
source/_integrations/isal.markdown @bdraco
source/_integrations/iskra.markdown @iskramis
source/_integrations/islamic_prayer_times.markdown @engrbm87 @cpfair
source/_integrations/ismartwindow.markdown @starkillerOG
source/_integrations/israel_rail.markdown @shaiu
source/_integrations/iss.markdown @DurgNomis-drol
source/_integrations/ista_ecotrend.markdown @tr4nt0r
source/_integrations/isy994.markdown @bdraco @shbatm
source/_integrations/ituran.markdown @shmuelzon
source/_integrations/izone.markdown @Swamp-Ig
source/_integrations/jellyfin.markdown @j-stienstra @ctalkington
source/_integrations/jellyfin.markdown @RunC0deRun @ctalkington
source/_integrations/jewish_calendar.markdown @tsvi
source/_integrations/juicenet.markdown @jesserockz
source/_integrations/justnimbus.markdown @kvanzuijlen
@ -452,14 +478,18 @@ source/_integrations/leaone.markdown @bdraco
source/_integrations/led_ble.markdown @bdraco
source/_integrations/legrand.markdown @cgtobi
source/_integrations/lektrico.markdown @lektrico
source/_integrations/letpot.markdown @jpelgrom
source/_integrations/leviton_z_wave.markdown @home-assistant/z-wave
source/_integrations/lg_netcast.markdown @Drafteed @splinter98
source/_integrations/lg_thinq.markdown @LG-ThinQ-Integration
source/_integrations/lidarr.markdown @tkdrob
source/_integrations/lifx.markdown @Djelibeybi
source/_integrations/light.markdown @home-assistant/core
source/_integrations/light.template.markdown @home-assistant/core
source/_integrations/linak.markdown @abmantis
source/_integrations/linear_garage_door.markdown @IceBotYT
source/_integrations/linux_battery.markdown @fabaff
source/_integrations/linx.markdown @starkillerOG
source/_integrations/litejet.markdown @joncar
source/_integrations/litterrobot.markdown @natekspencer @tkdrob
source/_integrations/livisi.markdown @StefanIacobLivisi @planbnet
@ -477,7 +507,7 @@ source/_integrations/luci.markdown @mzdrale
source/_integrations/luftdaten.markdown @fabaff @frenck
source/_integrations/lupusec.markdown @majuss @suaveolent
source/_integrations/lutron.markdown @cdheiser @wilburCForce
source/_integrations/lutron_caseta.markdown @swails @bdraco @danaues @eclair4151
source/_integrations/lutron_caseta.markdown @swails @danaues @eclair4151
source/_integrations/luxaflex.markdown @bdraco @kingy444 @trullock
source/_integrations/lyric.markdown @timmo001
source/_integrations/madeco.markdown @starkillerOG
@ -487,6 +517,8 @@ source/_integrations/martec.markdown @starkillerOG
source/_integrations/mastodon.markdown @fabaff @andrew-codechimp
source/_integrations/matrix.markdown @PaarthShah
source/_integrations/matter.markdown @home-assistant/matter
source/_integrations/mcp.markdown @allenporter
source/_integrations/mcp_server.markdown @allenporter
source/_integrations/mealie.markdown @joostlek @andrew-codechimp
source/_integrations/meater.markdown @Sotolotl @emontnemery
source/_integrations/medcom_ble.markdown @elafargue
@ -517,6 +549,7 @@ source/_integrations/mobile_app.markdown @home-assistant/core
source/_integrations/modem_callerid.markdown @tkdrob
source/_integrations/modern_forms.markdown @wonderslug
source/_integrations/moehlenhoff_alpha2.markdown @j-a-n
source/_integrations/monarch_money.markdown @jeeftor
source/_integrations/monessen.markdown @jeeftor
source/_integrations/monoprice.markdown @etsinko @OnFreund
source/_integrations/monzo.markdown @jakemartin-icl
@ -524,10 +557,12 @@ source/_integrations/moon.markdown @fabaff @frenck
source/_integrations/mopeka.markdown @bdraco
source/_integrations/motion_blinds.markdown @starkillerOG
source/_integrations/motionblinds_ble.markdown @LennP @jerrybboy
source/_integrations/motionblinds_matter.markdown @home-assistant/matter
source/_integrations/motioneye.markdown @dermotduffy
source/_integrations/mqtt.markdown @emontnemery @jbouwh @bdraco
source/_integrations/msteams.markdown @peroyvind
source/_integrations/mullvad.markdown @meichthys
source/_integrations/music_assistant.markdown @music-assistant
source/_integrations/mutesync.markdown @currentoor
source/_integrations/my.markdown @home-assistant/core
source/_integrations/mysensors.markdown @MartinHjelmare @functionpointer
@ -535,7 +570,7 @@ source/_integrations/mystrom.markdown @fabaff
source/_integrations/myuplink.markdown @pajzo @astrandb
source/_integrations/nam.markdown @bieniu
source/_integrations/nanoleaf.markdown @milanmeu @joostlek
source/_integrations/neato.markdown @Santobert
source/_integrations/nasweb.markdown @nasWebio
source/_integrations/nederlandse_spoorwegen.markdown @YarmoM
source/_integrations/ness_alarm.markdown @nickw444
source/_integrations/nest.markdown @allenporter
@ -545,19 +580,21 @@ source/_integrations/netgear.markdown @hacf-fr @Quentame @starkillerOG
source/_integrations/netgear_lte.markdown @tkdrob
source/_integrations/network.markdown @home-assistant/core
source/_integrations/nexia.markdown @bdraco
source/_integrations/nexity.markdown @imicknl @vlebourl @tetienne @nyroDev @tronix117 @alexfp14
source/_integrations/nexity.markdown @imicknl
source/_integrations/nextbus.markdown @vividboarder
source/_integrations/nextcloud.markdown @mib1185
source/_integrations/nextdns.markdown @bieniu
source/_integrations/nfandroidtv.markdown @tkdrob
source/_integrations/nibe_heatpump.markdown @elupus
source/_integrations/nice_go.markdown @IceBotYT
source/_integrations/nightscout.markdown @marciogranzotto
source/_integrations/niko_home_control.markdown @VandeurenGlenn
source/_integrations/nilu.markdown @hfurubotten
source/_integrations/nina.markdown @DeerMaximum
source/_integrations/nissan_leaf.markdown @filcole
source/_integrations/nmbs.markdown @thibmaek
source/_integrations/noaa_tides.markdown @jdelaney72
source/_integrations/nobo_hub.markdown @echoromeo @oyvindwe
source/_integrations/nordpool.markdown @gjohansson-ST
source/_integrations/notify.markdown @home-assistant/core
source/_integrations/notify_events.markdown @matrozov @papajojo
source/_integrations/notion.markdown @bachya
@ -567,21 +604,24 @@ source/_integrations/nuheat.markdown @tstabrawa
source/_integrations/nuki.markdown @pschmitt @pvizeli @pree
source/_integrations/numato.markdown @clssn
source/_integrations/number.markdown @home-assistant/core @Shulyaka
source/_integrations/nut.markdown @bdraco @ollo69 @pestevez
source/_integrations/nut.markdown @bdraco @ollo69 @pestevez @tdfountain
source/_integrations/nutrichef.markdown @bdraco
source/_integrations/nws.markdown @MatthewFlamm @kamiyo
source/_integrations/nyt_games.markdown @joostlek
source/_integrations/nzbget.markdown @chriscla
source/_integrations/obihai.markdown @dshokouhi @ejpenney
source/_integrations/octoprint.markdown @rfleming71
source/_integrations/ohmconnect.markdown @robbiet480
source/_integrations/ohme.markdown @dan-r
source/_integrations/ollama.markdown @synesthesiam
source/_integrations/ombi.markdown @larssont
source/_integrations/onboarding.markdown @home-assistant/core
source/_integrations/oncue.markdown @bdraco @peterager
source/_integrations/ondilo_ico.markdown @JeromeHXP
source/_integrations/onedrive.markdown @zweckj
source/_integrations/onewire.markdown @garbled1 @epenet
source/_integrations/onkyo.markdown @arturpragacz
source/_integrations/onvif.markdown @hunterjm
source/_integrations/onkyo.markdown @arturpragacz @eclair4151
source/_integrations/onvif.markdown @hunterjm @jterrace
source/_integrations/open_meteo.markdown @frenck
source/_integrations/openai_conversation.markdown @balloob
source/_integrations/openerz.markdown @misialq
@ -600,11 +640,14 @@ source/_integrations/oru_opower.markdown @tronikos
source/_integrations/osoenergy.markdown @osohotwateriot
source/_integrations/otbr.markdown @home-assistant/core
source/_integrations/ourgroceries.markdown @OnFreund
source/_integrations/overkiz.markdown @imicknl @vlebourl @tetienne @nyroDev @tronix117 @alexfp14
source/_integrations/overkiz.markdown @imicknl
source/_integrations/overseerr.markdown @joostlek
source/_integrations/ovo_energy.markdown @timmo001
source/_integrations/p1_monitor.markdown @klaasnicolaas
source/_integrations/palazzetti.markdown @dotvav
source/_integrations/panel_custom.markdown @home-assistant/frontend
source/_integrations/pcs_lighting.markdown @gwww
source/_integrations/peblar.markdown @frenck
source/_integrations/peco.markdown @IceBotYT
source/_integrations/peco_opower.markdown @tronikos
source/_integrations/pegel_online.markdown @mib1185
@ -612,20 +655,21 @@ source/_integrations/pepco.markdown @tronikos
source/_integrations/permobil.markdown @IsakNyberg
source/_integrations/persistent_notification.markdown @home-assistant/core
source/_integrations/pge.markdown @tronikos
source/_integrations/pglab.markdown @pglab-electronics
source/_integrations/philips_js.markdown @elupus
source/_integrations/pi_hole.markdown @shenxn
source/_integrations/picnic.markdown @corneyl
source/_integrations/pilight.markdown @trekky12
source/_integrations/picnic.markdown @corneyl @codesalatdev
source/_integrations/pinecil.markdown @tr4nt0r
source/_integrations/ping.markdown @jpbede
source/_integrations/piper.markdown @balloob @synesthesiam
source/_integrations/plaato.markdown @JohNan
source/_integrations/plex.markdown @jjlawren
source/_integrations/plugwise.markdown @CoMPaTech @bouwew @frenck
source/_integrations/plugwise.markdown @CoMPaTech @bouwew
source/_integrations/plum_lightpad.markdown @ColinHarrington @prystupa
source/_integrations/point.markdown @fredrike
source/_integrations/poolsense.markdown @haemishkyd
source/_integrations/portlandgeneral.markdown @tronikos
source/_integrations/powerfox.markdown @klaasnicolaas
source/_integrations/powerwall.markdown @bdraco @jrester @daniel-simpson
source/_integrations/private_ble_device.markdown @Jc2k
source/_integrations/profiler.markdown @bdraco
@ -647,6 +691,7 @@ 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/qbus.markdown @Qbus-iot @thomasddn
source/_integrations/qingping.markdown @bdraco
source/_integrations/qld_bushfire.markdown @exxamalte
source/_integrations/qnap.markdown @disforw
@ -680,7 +725,7 @@ source/_integrations/reolink.markdown @starkillerOG
source/_integrations/repairs.markdown @home-assistant/core
source/_integrations/repetier.markdown @ShadowBr0ther
source/_integrations/rest_command.markdown @jpbede
source/_integrations/rexel.markdown @imicknl @vlebourl @tetienne @nyroDev @tronix117 @alexfp14
source/_integrations/rexel.markdown @imicknl
source/_integrations/rflink.markdown @javicalle
source/_integrations/rfxtrx.markdown @danielhiversen @elupus @RobBie1221
source/_integrations/rhasspy.markdown @balloob @synesthesiam
@ -689,16 +734,16 @@ 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 @Lash-L
source/_integrations/roborock.markdown @Lash-L @allenporter
source/_integrations/roku.markdown @ctalkington
source/_integrations/romy.markdown @xeniter
source/_integrations/roomba.markdown @pschmitt @cyr-ius @shenxn @Xitee1 @Orhideous
source/_integrations/roomba.markdown @pschmitt @cyr-ius @shenxn @Orhideous
source/_integrations/roon.markdown @pavoni
source/_integrations/rpi_power.markdown @shenxn @swetoast
source/_integrations/rss_feed_template.markdown @home-assistant/core
source/_integrations/rtsp_to_webrtc.markdown @allenporter
source/_integrations/ruckus_unleashed.markdown @lanrat @ms264556 @gabe565
source/_integrations/russound_rio.markdown @noahhusby
source/_integrations/russound_rnet.markdown @noahhusby
source/_integrations/ruuvi_gateway.markdown @akx
source/_integrations/ruuvitag_ble.markdown @akx
source/_integrations/rympro.markdown @OnFreund @elad-bar @maorcc
@ -726,6 +771,8 @@ source/_integrations/sensor.markdown @home-assistant/core
source/_integrations/sensorblue.markdown @bdraco
source/_integrations/sensorpro.markdown @bdraco
source/_integrations/sensorpush.markdown @bdraco
source/_integrations/sensorpush_cloud.markdown @sstallion
source/_integrations/sensoterra.markdown @markruys
source/_integrations/sentry.markdown @dcramer @frenck
source/_integrations/senz.markdown @milanmeu
source/_integrations/serial.markdown @fabaff
@ -743,60 +790,63 @@ source/_integrations/simplefin.markdown @scottg489 @jeeftor
source/_integrations/simplepush.markdown @engrbm87
source/_integrations/simplisafe.markdown @bachya
source/_integrations/simply_automated.markdown @gwww
source/_integrations/simu.markdown @imicknl @vlebourl @tetienne @nyroDev @tronix117 @alexfp14
source/_integrations/simu.markdown @imicknl
source/_integrations/sinch.markdown @bendikrb
source/_integrations/siren.markdown @home-assistant/core @raman325
source/_integrations/sisyphus.markdown @jkeljo
source/_integrations/sky_hub.markdown @rogerselwyn
source/_integrations/sky_remote.markdown @dunnmj @saty9
source/_integrations/skybell.markdown @tkdrob
source/_integrations/slack.markdown @tkdrob @fletcherau
source/_integrations/sleepiq.markdown @mfugate1 @kbickar
source/_integrations/slide.markdown @ualex73
source/_integrations/slide_local.markdown @dontinelli
source/_integrations/slimproto.markdown @marcelveldt
source/_integrations/sma.markdown @kellerza @rklomp
source/_integrations/sma.markdown @kellerza @rklomp @erwindouna
source/_integrations/smappee.markdown @bsmappee
source/_integrations/smart_blinds.markdown @starkillerOG
source/_integrations/smart_home.markdown @starkillerOG
source/_integrations/smart_meter_texas.markdown @grahamwetzler
source/_integrations/smart_rollos.markdown @starkillerOG
source/_integrations/smarther.markdown @cgtobi
source/_integrations/smarttub.markdown @mdz
source/_integrations/smarty.markdown @z0mbieprocess
source/_integrations/smhi.markdown @gjohansson-ST
source/_integrations/smlight.markdown @tl-sl
source/_integrations/sms.markdown @ocalvo
source/_integrations/smud.markdown @tronikos
source/_integrations/snapcast.markdown @luar123
source/_integrations/snmp.markdown @nmaggioni
source/_integrations/snoo.markdown @Lash-L
source/_integrations/snooz.markdown @AustinBrunkhorst
source/_integrations/solaredge.markdown @frenck @bdraco
source/_integrations/solaredge_local.markdown @drobtravels @scheric
source/_integrations/solarlog.markdown @Ernst79 @dontinelli
source/_integrations/solax.markdown @squishykid
source/_integrations/solax.markdown @squishykid @Darsstar
source/_integrations/soma.markdown @ratsept @sebfortier2288
source/_integrations/somfy.markdown @imicknl @vlebourl @tetienne @nyroDev @tronix117 @alexfp14
source/_integrations/somfy.markdown @imicknl
source/_integrations/sonarr.markdown @ctalkington
source/_integrations/songpal.markdown @rytilahti @shenxn
source/_integrations/sonos.markdown @jjlawren @peterager
source/_integrations/soundtouch.markdown @kroimon
source/_integrations/spaceapi.markdown @fabaff
source/_integrations/speedtestdotnet.markdown @rohankapoorcom @engrbm87
source/_integrations/spider.markdown @peternijssen
source/_integrations/splunk.markdown @Bre77
source/_integrations/spotify.markdown @frenck @joostlek
source/_integrations/sql.markdown @gjohansson-ST @dougiteixeira
source/_integrations/squeezebox.markdown @rajlaud
source/_integrations/squeezebox.markdown @rajlaud @pssc @peteS-UK
source/_integrations/srp_energy.markdown @briglx
source/_integrations/starline.markdown @anonym-tsk
source/_integrations/starlink.markdown @boswelja
source/_integrations/statistics.markdown @ThomDietrich
source/_integrations/statistics.markdown @ThomDietrich @gjohansson-ST
source/_integrations/steam_online.markdown @tkdrob
source/_integrations/steamist.markdown @bdraco
source/_integrations/stiebel_eltron.markdown @fucm
source/_integrations/stookalert.markdown @fwestenberg @frenck
source/_integrations/stookwijzer.markdown @fwestenberg
source/_integrations/stream.markdown @hunterjm @uvjustin @allenporter
source/_integrations/stt.markdown @home-assistant/core
source/_integrations/subaru.markdown @G-Two
source/_integrations/suez_water.markdown @ooii
source/_integrations/suez_water.markdown @ooii @jb101010-2
source/_integrations/sun.markdown @Swamp-Ig
source/_integrations/sunweg.markdown @rokam
source/_integrations/supla.markdown @mwegrzynek
@ -809,8 +859,8 @@ source/_integrations/switch.template.markdown @home-assistant/core
source/_integrations/switch_as_x.markdown @home-assistant/core
source/_integrations/switchbee.markdown @jafar-atili
source/_integrations/switchbot.markdown @danielhiversen @RenierM26 @murtas @Eloston @dsypniewski
source/_integrations/switchbot_cloud.markdown @SeraphicRav @laurence-presland
source/_integrations/switcher_kis.markdown @thecode
source/_integrations/switchbot_cloud.markdown @SeraphicRav @laurence-presland @Gigatrappeur
source/_integrations/switcher_kis.markdown @thecode @YogevBokobza
source/_integrations/switchmate.markdown @danielhiversen @qiz-li
source/_integrations/symfonisk.markdown @jjlawren @peterager
source/_integrations/syncthing.markdown @zhulik
@ -819,7 +869,7 @@ source/_integrations/synology_dsm.markdown @hacf-fr @Quentame @mib1185
source/_integrations/synology_srm.markdown @aerialls
source/_integrations/system_bridge.markdown @timmo001
source/_integrations/systemmonitor.markdown @gjohansson-ST
source/_integrations/tado.markdown @chiefdragon @erwindouna
source/_integrations/tado.markdown @erwindouna
source/_integrations/tag.markdown @balloob @dmulcahey
source/_integrations/tailscale.markdown @frenck
source/_integrations/tailwind.markdown @frenck
@ -831,7 +881,7 @@ source/_integrations/tautulli.markdown @ludeeus @tkdrob
source/_integrations/technove.markdown @Moustachauve
source/_integrations/tedee.markdown @patrickhilker @zweckj
source/_integrations/tellduslive.markdown @fredrike
source/_integrations/template.markdown @PhracturedBlue @tetienne @home-assistant/core
source/_integrations/template.markdown @PhracturedBlue @home-assistant/core
source/_integrations/tesla_fleet.markdown @Bre77
source/_integrations/tesla_wall_connector.markdown @einarhauks
source/_integrations/teslemetry.markdown @Bre77
@ -854,6 +904,7 @@ source/_integrations/todoist.markdown @boralyl
source/_integrations/tolo.markdown @MatthiasLohr
source/_integrations/tomorrowio.markdown @raman325 @lymanepp
source/_integrations/totalconnect.markdown @austinmroczek
source/_integrations/touchline_sl.markdown @jnsgruk
source/_integrations/tplink.markdown @rytilahti @bdraco @sdb9696
source/_integrations/tplink_omada.markdown @MarkGodwin
source/_integrations/tplink_tapo.markdown @rytilahti @bdraco @sdb9696
@ -866,16 +917,19 @@ source/_integrations/trafikverket_train.markdown @gjohansson-ST
source/_integrations/trafikverket_weatherstation.markdown @gjohansson-ST
source/_integrations/transmission.markdown @engrbm87 @JPHutchins
source/_integrations/trend.markdown @jpbede
source/_integrations/triggercmd.markdown @rvmey
source/_integrations/tts.markdown @home-assistant/core
source/_integrations/tuya.markdown @Tuya @zlinoliver @frenck
source/_integrations/tuya.markdown @Tuya @zlinoliver
source/_integrations/twentemilieu.markdown @frenck
source/_integrations/twinkly.markdown @dr1rrb @Robbie1221 @Olen
source/_integrations/twitch.markdown @joostlek
source/_integrations/ubiwizz.markdown @imicknl @vlebourl @tetienne @nyroDev @tronix117 @alexfp14
source/_integrations/ubiwizz.markdown @imicknl
source/_integrations/ublockout.markdown @starkillerOG
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 @RaHehl
source/_integrations/upb.markdown @gwww
source/_integrations/upc_connect.markdown @pvizeli @fabaff
source/_integrations/upcloud.markdown @scop
@ -893,12 +947,12 @@ source/_integrations/vacuum.template.markdown @home-assistant/core
source/_integrations/vallox.markdown @andre-richter @slovdahl @viiru- @yozik04
source/_integrations/valve.markdown @home-assistant/core
source/_integrations/velbus.markdown @Cereal2nd @brefra
source/_integrations/velux.markdown @Julius2342 @DeerMaximum
source/_integrations/velux.markdown @Julius2342 @DeerMaximum @pawlizio
source/_integrations/venstar.markdown @garbled1 @jhollowe
source/_integrations/vermont_castings.markdown @jeeftor
source/_integrations/versasense.markdown @imstevenxyz
source/_integrations/version.markdown @ludeeus
source/_integrations/vesync.markdown @markperdue @webdjoe @thegardenmonkey @cdnninja
source/_integrations/vesync.markdown @markperdue @webdjoe @thegardenmonkey @cdnninja @iprak
source/_integrations/vicare.markdown @CFenner
source/_integrations/vilfo.markdown @ManneW
source/_integrations/vivotek.markdown @HarlemSquirrel
@ -915,6 +969,7 @@ source/_integrations/wake_word.markdown @home-assistant/core @synesthesiam
source/_integrations/wallbox.markdown @hesselonline
source/_integrations/waqi.markdown @joostlek
source/_integrations/water_heater.markdown @home-assistant/core
source/_integrations/watergate.markdown @adam-the-hero
source/_integrations/watson_tts.markdown @rutkai
source/_integrations/watttime.markdown @bachya
source/_integrations/waze_travel_time.markdown @eifinger
@ -923,10 +978,12 @@ source/_integrations/weather.template.markdown @home-assistant/core
source/_integrations/weatherflow.markdown @natekspencer @jeeftor
source/_integrations/weatherflow_cloud.markdown @jeeftor
source/_integrations/weatherkit.markdown @tjhorner
source/_integrations/webdav.markdown @jpbede
source/_integrations/webhook.markdown @home-assistant/core
source/_integrations/webmin.markdown @autinerd
source/_integrations/webostv.markdown @thecode
source/_integrations/websocket_api.markdown @home-assistant/core
source/_integrations/weheat.markdown @jesperraemaekers
source/_integrations/wemo.markdown @esev
source/_integrations/whirlpool.markdown @abmantis @mkmer
source/_integrations/whisper.markdown @balloob @synesthesiam
@ -937,6 +994,7 @@ source/_integrations/wirelesstag.markdown @sergeymaysak
source/_integrations/withings.markdown @joostlek
source/_integrations/wiz.markdown @sbidy
source/_integrations/wled.markdown @frenck
source/_integrations/wmspro.markdown @mback2k
source/_integrations/wolflink.markdown @adamkrol93 @mtielen
source/_integrations/workday.markdown @fabaff @gjohansson-ST
source/_integrations/worldclock.markdown @fabaff
@ -948,6 +1006,7 @@ source/_integrations/xiaomi_ble.markdown @Jc2k @Ernst79
source/_integrations/xiaomi_miio.markdown @rytilahti @syssi @starkillerOG
source/_integrations/xiaomi_tv.markdown @simse
source/_integrations/xmpp.markdown @fabaff @flowolf
source/_integrations/yale.markdown @bdraco
source/_integrations/yale_home.markdown @bdraco
source/_integrations/yale_smart_alarm.markdown @gjohansson-ST
source/_integrations/yalexs_ble.markdown @bdraco
@ -960,6 +1019,7 @@ source/_integrations/yi.markdown @bachya
source/_integrations/yolink.markdown @matrixd2
source/_integrations/youless.markdown @gjong
source/_integrations/youtube.markdown @joostlek
source/_integrations/zabbix.markdown @kruton
source/_integrations/zamg.markdown @killer0071234
source/_integrations/zengge.markdown @emontnemery
source/_integrations/zeroconf.markdown @bdraco

13
Gemfile
View File

@ -4,15 +4,16 @@ ruby '> 2.5.0'
group :development do
gem 'rake', '13.2.1'
gem 'jekyll', '4.3.4'
gem 'jekyll', '4.4.1'
gem 'compass', '1.0.3'
gem 'sass-globbing', '1.1.5'
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.66.1'
gem 'ruby-lsp', '0.18.3'
gem 'rackup', '2.1.0'
gem 'sass-embedded', '1.86.0'
gem 'rubocop', '1.74.0'
gem 'ruby-lsp', '0.23.12'
gem 'rackup', '2.2.1'
end
group :jekyll_plugins do
@ -22,8 +23,8 @@ group :jekyll_plugins do
gem 'jekyll-toc', '0.19.0'
end
gem 'sinatra', '4.0.0'
gem 'nokogiri', '1.16.7'
gem 'sinatra', '4.1.1'
gem 'nokogiri', '1.18.6'
# Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem
# and associated library

View File

@ -3,12 +3,12 @@ GEM
specs:
addressable (2.8.7)
public_suffix (>= 2.0.2, < 7.0)
ast (2.4.2)
ast (2.4.3)
base64 (0.2.0)
bigdecimal (3.1.8)
bigdecimal (3.1.9)
chunky_png (1.4.0)
colorator (1.1.0)
commonmarker (0.23.10)
commonmarker (0.23.11)
compass (1.0.3)
chunky_png (~> 1.2)
compass-core (~> 1.0.2)
@ -21,34 +21,38 @@ GEM
sass (>= 3.3.0, < 3.5)
compass-import-once (1.0.5)
sass (>= 3.2, < 3.5)
concurrent-ruby (1.3.4)
concurrent-ruby (1.3.5)
csv (3.3.3)
em-websocket (0.5.3)
eventmachine (>= 0.12.9)
http_parser.rb (~> 0)
eventmachine (1.2.7)
ffi (1.17.0-arm64-darwin)
ffi (1.17.0-x86_64-linux-gnu)
ffi (1.17.1-arm64-darwin)
ffi (1.17.1-x86_64-linux-gnu)
forwardable-extended (2.6.0)
google-protobuf (4.28.2-arm64-darwin)
google-protobuf (4.30.1-arm64-darwin)
bigdecimal
rake (>= 13)
google-protobuf (4.28.2-x86_64-linux)
google-protobuf (4.30.1-x86_64-linux)
bigdecimal
rake (>= 13)
http_parser.rb (0.8.0)
i18n (1.14.6)
i18n (1.14.7)
concurrent-ruby (~> 1.0)
jekyll (4.3.4)
jekyll (4.4.1)
addressable (~> 2.4)
base64 (~> 0.2)
colorator (~> 1.0)
csv (~> 3.0)
em-websocket (~> 0.5)
i18n (~> 1.0)
jekyll-sass-converter (>= 2.0, < 4.0)
jekyll-watch (~> 2.0)
json (~> 2.6)
kramdown (~> 2.3, >= 2.3.1)
kramdown-parser-gfm (~> 1.0)
liquid (~> 4.0)
mercenary (>= 0.3.6, < 0.5)
mercenary (~> 0.3, >= 0.3.6)
pathutil (~> 0.9)
rouge (>= 3.0, < 5.0)
safe_yaml (~> 1.0)
@ -57,8 +61,8 @@ GEM
jekyll-commonmark (1.4.0)
commonmarker (~> 0.22)
jekyll-paginate (1.1.0)
jekyll-sass-converter (3.0.0)
sass-embedded (~> 1.54)
jekyll-sass-converter (3.1.0)
sass-embedded (~> 1.75)
jekyll-sitemap (1.4.0)
jekyll (>= 3.7, < 5.0)
jekyll-toc (0.19.0)
@ -66,101 +70,106 @@ GEM
nokogiri (~> 1.12)
jekyll-watch (2.2.1)
listen (~> 3.0)
json (2.7.2)
kramdown (2.4.0)
rexml
json (2.10.2)
kramdown (2.5.1)
rexml (>= 3.3.9)
kramdown-parser-gfm (1.1.0)
kramdown (~> 2.0)
language_server-protocol (3.17.0.3)
language_server-protocol (3.17.0.4)
lint_roller (1.1.0)
liquid (4.0.4)
listen (3.9.0)
rb-fsevent (~> 0.10, >= 0.10.3)
rb-inotify (~> 0.9, >= 0.9.10)
logger (1.6.1)
logger (1.6.6)
mercenary (0.4.0)
multi_json (1.15.0)
mustermann (3.0.3)
ruby2_keywords (~> 0.0.1)
nokogiri (1.16.7-arm64-darwin)
nokogiri (1.18.6-arm64-darwin)
racc (~> 1.4)
nokogiri (1.16.7-x86_64-linux)
nokogiri (1.18.6-x86_64-linux-gnu)
racc (~> 1.4)
parallel (1.26.3)
parser (3.3.5.0)
parser (3.3.7.2)
ast (~> 2.4.1)
racc
pathutil (0.16.2)
forwardable-extended (~> 2.6)
prism (1.0.0)
prism (1.4.0)
public_suffix (6.0.1)
racc (1.8.1)
rack (3.1.7)
rack-protection (4.0.0)
rack (3.1.12)
rack-protection (4.1.1)
base64 (>= 0.1.0)
logger (>= 1.6.0)
rack (>= 3.0.0, < 4)
rack-session (2.0.0)
rack-session (2.1.0)
base64 (>= 0.1.0)
rack (>= 3.0.0)
rackup (2.1.0)
rackup (2.2.1)
rack (>= 3)
webrick (~> 1.8)
rainbow (3.1.1)
rake (13.2.1)
rb-fsevent (0.11.2)
rb-inotify (0.11.1)
ffi (~> 1.0)
rbs (3.5.3)
rbs (3.9.1)
logger
regexp_parser (2.9.2)
rexml (3.3.7)
rouge (4.4.0)
rubocop (1.66.1)
regexp_parser (2.10.0)
rexml (3.4.1)
rouge (4.5.1)
rubocop (1.74.0)
json (~> 2.3)
language_server-protocol (>= 3.17.0)
language_server-protocol (~> 3.17.0.2)
lint_roller (~> 1.1.0)
parallel (~> 1.10)
parser (>= 3.3.0.2)
rainbow (>= 2.2.2, < 4.0)
regexp_parser (>= 2.4, < 3.0)
rubocop-ast (>= 1.32.2, < 2.0)
regexp_parser (>= 2.9.3, < 3.0)
rubocop-ast (>= 1.38.0, < 2.0)
ruby-progressbar (~> 1.7)
unicode-display_width (>= 2.4.0, < 3.0)
rubocop-ast (1.32.3)
parser (>= 3.3.1.0)
ruby-lsp (0.18.3)
unicode-display_width (>= 2.4.0, < 4.0)
rubocop-ast (1.43.0)
parser (>= 3.3.7.2)
prism (~> 1.4)
ruby-lsp (0.23.12)
language_server-protocol (~> 3.17.0)
prism (~> 1.0)
prism (>= 1.2, < 2.0)
rbs (>= 3, < 4)
sorbet-runtime (>= 0.5.10782)
ruby-progressbar (1.13.0)
ruby2_keywords (0.0.5)
safe_yaml (1.0.5)
sass (3.4.25)
sass-embedded (1.79.3-arm64-darwin)
google-protobuf (~> 4.27)
sass-embedded (1.79.3-x86_64-linux-gnu)
google-protobuf (~> 4.27)
sass-embedded (1.86.0-arm64-darwin)
google-protobuf (~> 4.30)
sass-embedded (1.86.0-x86_64-linux-gnu)
google-protobuf (~> 4.30)
sass-globbing (1.1.5)
sass (>= 3.1)
sassc (2.1.0)
ffi (~> 1.9)
sassc (2.1.0-x86_64-linux)
ffi (~> 1.9)
sinatra (4.0.0)
sinatra (4.1.1)
logger (>= 1.6.0)
mustermann (~> 3.0)
rack (>= 3.0.0, < 4)
rack-protection (= 4.0.0)
rack-protection (= 4.1.1)
rack-session (>= 2.0.0, < 3)
tilt (~> 2.0)
sorbet-runtime (0.5.11581)
sorbet-runtime (0.5.11956)
stringex (2.8.6)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
tilt (2.4.0)
tilt (2.6.0)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
tzinfo-data (1.2024.2)
tzinfo-data (1.2025.2)
tzinfo (>= 1.0.0)
unicode-display_width (2.6.0)
webrick (1.8.2)
webrick (1.9.1)
PLATFORMS
arm64-darwin-23
@ -168,19 +177,20 @@ PLATFORMS
DEPENDENCIES
compass (= 1.0.3)
jekyll (= 4.3.4)
jekyll (= 4.4.1)
jekyll-commonmark (= 1.4.0)
jekyll-paginate (= 1.1.0)
jekyll-sitemap (= 1.4.0)
jekyll-toc (= 0.19.0)
nokogiri (= 1.16.7)
rackup (= 2.1.0)
nokogiri (= 1.18.6)
rackup (= 2.2.1)
rake (= 13.2.1)
rubocop (= 1.66.1)
ruby-lsp (= 0.18.3)
rubocop (= 1.74.0)
ruby-lsp (= 0.23.12)
sass-embedded (= 1.86.0)
sass-globbing (= 1.1.5)
sassc (= 2.1.0)
sinatra (= 4.0.0)
sinatra (= 4.1.1)
stringex (= 2.8.6)
tzinfo (~> 2.0)
tzinfo-data
@ -189,4 +199,4 @@ RUBY VERSION
ruby 2.6.2p47
BUNDLED WITH
2.5.3
2.5.3

View File

@ -40,3 +40,5 @@ When you're done working on the site, run the following command to move the post
```bash
bundle exec rake integrate
```
[![Home Assistant - A project from the Open Home Foundation](https://www.openhomefoundation.org/badges/home-assistant.png)](https://www.openhomefoundation.org/)

View File

@ -106,10 +106,10 @@ social:
account: "https://fosstodon.org/@homeassistant"
# Home Assistant release details
current_major_version: 2024
current_minor_version: 9
current_patch_version: 3
date_released: 2024-09-24
current_major_version: 2025
current_minor_version: 3
current_patch_version: 4
date_released: 2025-03-21
# Either # or the anchor link to latest release notes in the blog post.
# Must be prefixed with a # and have double quotes around it.
@ -221,7 +221,7 @@ toc:
installation:
container: "ghcr.io/home-assistant/home-assistant"
versions:
python: "3.12"
python: "3.13"
types:
odroid:
board: ODROID

834
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -5,17 +5,17 @@
"devDependencies": {
"remark-cli": "^12.0.1",
"remark-frontmatter": "^5.0.0",
"remark-lint": "^10.0.0",
"remark-lint-fenced-code-flag": "^4.0.0",
"remark-lint-heading-increment": "^4.0.0",
"remark-lint-heading-style": "^4.0.0",
"remark-lint-no-shell-dollars": "^4.0.0",
"remark-lint-ordered-list-marker-style": "^4.0.0",
"remark-lint-ordered-list-marker-value": "^4.0.0",
"remark-lint": "^10.0.1",
"remark-lint-fenced-code-flag": "^4.1.1",
"remark-lint-heading-increment": "^4.0.1",
"remark-lint-heading-style": "^4.0.1",
"remark-lint-no-shell-dollars": "^4.0.1",
"remark-lint-ordered-list-marker-style": "^4.0.1",
"remark-lint-ordered-list-marker-value": "^4.0.1",
"remark-lint-prohibited-strings": "^4.0.0",
"remark-lint-unordered-list-marker-style": "^4.0.0",
"remark-lint-unordered-list-marker-style": "^4.0.1",
"remark-stringify": "^11.0.0",
"textlint": "^14.2.0",
"textlint": "^14.5.0",
"textlint-filter-rule-comments": "^1.2.2",
"textlint-rule-common-misspellings": "^1.0.1",
"textlint-rule-terminology": "^5.0.13"

View File

@ -124,6 +124,11 @@ module Jekyll
end
end
end
def case_insensitive_sort(input, key)
return input unless input.is_a?(Array)
input.sort_by { |item| item[key].to_s.downcase }
end
end
end

View File

@ -5,7 +5,8 @@ module Jekyll
def initialize(tag_name, args, tokens)
super
if args.strip =~ SYNTAX
@icon = Regexp.last_match(1).downcase
@icon = Regexp.last_match[:icon].downcase
@title = Regexp.last_match[:title]
else
raise SyntaxError, <<~MSG
Syntax error in tag 'icon' while parsing the following options:
@ -13,18 +14,29 @@ module Jekyll
#{args}
Valid syntax:
{% icon "<icon-set>:<icon-name>" %}
{% icon "<icon-set>:<icon-name>" [title="<title>"] %}
MSG
end
end
def default_title(icon)
# split away "mdi:" part
icon_name = icon.split(':').last
# remove dashes and capitalize e.g. "water-polo" to "Water polo"
parts = icon_name.split('-')
parts[0] = parts[0].capitalize
parts.join(' ')
end
def render(_context)
"<iconify-icon inline icon='#{@icon}'></iconify-icon>"
title = @title || default_title(@icon)
"<iconify-icon inline icon='#{@icon}' title='#{title}'></iconify-icon>"
end
private
SYNTAX = %r!^"([a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*)"$!.freeze
SYNTAX = %r!^"(?<icon>[a-z0-9]+(?:-[a-z0-9]+)*:[a-z0-9]+(?:-[a-z0-9]+)*)"(?:\s+title="(?<title>[^"]+)")?$!.freeze
end
end
end

View File

@ -20,6 +20,7 @@
@import "plugins/integration_alert";
@import "base/sidebar";
@import "aside/buy_dialog";
@import "aside/recent_posts";
@import "aside/github";
@import "aside/pinboard";

View File

@ -366,7 +366,7 @@ header .breadcrumbs {
margin: 0 -24px;
text-align: left;
h4 {
h3 {
text-transform: uppercase;
font-size: .9rem;
letter-spacing: 0.005em;
@ -444,16 +444,21 @@ header .breadcrumbs {
h1 {
font-family: $heading-font;
-webkit-font-smoothing: antialiased;
font-size: 1.33rem;
font-size: 1.3125rem;
font-weight: 600;
letter-spacing: -0.012em;
line-height: 40px;
color: #212121;
margin: -8px 0 0;
iconify-icon {
margin-right: 8px;
}
}
&.text {
padding: 24px;
font-size: 1rem;
h1 {
padding: 0px 0px 12px;
@ -517,7 +522,7 @@ a.material-card:hover {
.img {
background-color: $grayLighter;
width: calc(100%-8px);
aspect-ratio: 120/63;
// aspect-ratio: 120/63;
background-size: cover;
background-position: center;
border-radius: 8px;
@ -656,21 +661,34 @@ a.material-card:hover {
.blog-date {
white-space: nowrap;
}
ol {
margin: 0;
}
}
.highlight-blog-post {
font-size: 2rem;
line-height: 1.15;
padding: 15px;
display: block;
padding: 24px;
text-decoration: none;
color: white;
transition: background-color 0.5s;
background-color: #038fc7;
transition: background-color 0.5s, box-shadow 0.5s;
background-color: $primary-color;
display: flex;
padding: 20px 12px 20px 24px;
align-items: center;
gap: 10px;
align-self: stretch;
p {
font-size: 1rem;
margin: 10px 0 0 0;
&.large {
font-size: 2.25rem;
line-height: 1.33333;
&.lead {
font-family: $heading-font;
font-size: 1.5rem;
font-weight: 700;
line-height: 1.15;
margin-top: 0;
}
}
&:hover {
@ -682,6 +700,71 @@ a.material-card:hover {
}
}
.highlight-detail-post {
padding: 24px;
text-decoration: none;
color: white;
transition: background-color 0.5s, box-shadow 0.5s;
background-color: #006895;
box-shadow: inset 0 0 64px #038fc7;
font-size: 1.5rem;
.caption {
padding-bottom: 24px;
p {
font-family: $heading-font;
font-size: 1.25rem;
font-weight: 600;
margin: 0;
line-height: 1.2;
strong {
font-size: 1.75rem;
font-weight: 800;
}
}
}
.detail-feature {
display: flex;
align-items: flex-start;
gap: 16px;
align-self: stretch;
p {
font-size: 0.875rem;
&.lead {
font-size: 1rem;
margin-bottom: 4px;
font-weight: 500;
}
}
iconify-icon {
padding: 8px;
border-radius: 50%;
background: rgba(0, 0, 0, 0.15);
color: white;
}
}
animation-name: box-shadow-color;
animation-duration: 5s;
animation-iteration-count: infinite;
animation-direction: alternate;
@keyframes box-shadow-color {
from {
box-shadow: inset 0 0 64px hsl(197, 97%, 40%);
}
to {
box-shadow: inset 0 0 64px hsl(159, 100%, 35%);
}
}
}
.events {
padding: 16px;
@ -726,15 +809,16 @@ a.material-card:hover {
.picture-promo {
display: block;
padding-top: 30%;
padding-top: 33%;
background-size: cover;
background-position: center;
text-decoration: none;
border: none;
.caption {
padding: 8px 12px 12px;
background-color: rgba(0, 0, 0, 0.54);
padding: 48px 24px 24px 24px;
background: rgb(0,0,0);
background: linear-gradient(180deg, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 100%);
color: white;
border-bottom-left-radius: 16px;
border-bottom-right-radius: 16px;
@ -743,16 +827,19 @@ a.material-card:hover {
align-items: center;
.title {
font-size: 20px;
font-weight: 400;
line-height: 1.2em;
font-family: $heading-font;
font-size: 1.5rem;
font-weight: 700;
line-height: normal;
}
.subtitle {
margin-top: 4px;
line-height: 1.4em;
font-size: 12px;
margin-top: 8px;
line-height: 1.5rem;
font-size: 1rem;
font-weight: initial;
text-shadow: 0px 4px 16px rgba(0, 0, 0, 0.33);
opacity: .8;
}
svg {
@ -762,6 +849,21 @@ a.material-card:hover {
min-width: 32px;
}
}
&.picture-top {
padding-top: 0;
padding-bottom: 33%;
.caption {
padding: 24px 24px 48px 24px;
background: rgb(0,0,0);
background: linear-gradient(0deg, rgba(0,0,0,0) 0%, rgba(0,0,0,1) 100%);
border-top-left-radius: 16px;
border-top-right-radius: 16px;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
}
}
.supported-brands {
@ -781,8 +883,101 @@ a.material-card:hover {
}
}
.getting-started {
text-align: center;
.badge {
display: flex;
padding: 2px 8px 2px 8px;
align-items: flex-start;
gap: 8px;
border-radius: 4px;
background: #E8E6F0;
font-family: $heading-font;
font-size: 1rem;
font-weight: 700;
text-transform: uppercase;
}
.getting-started-grid {
display: flex;
padding: 48px 0 48px 24px;
align-items: flex-start;
gap: 24px;
}
.getting-started-device {
.content {
display: flex;
flex-direction: column;
align-items: center;
gap: 16px;
img {
box-shadow: none;
border: 0;
}
h3 {
font-size: 2rem;
font-weight: 700;
line-height: 133%;
text-transform: none;
letter-spacing: -.75px;
margin: 0;
}
p {
font-size: 1rem;
line-height: 1.5;
opacity: .9;
margin: 0;
}
}
.button {
padding: 6px 20px;
background: $primary-color;
color: white;
font-size: 1rem;
text-transform: uppercase;
}
}
#HA_Yellow, #Raspberry_Pi {
padding-top: 96px;
}
#HA_Yellow .badge {
color: $orange;
}
#HA_Green .badge {
color: $green;
}
#Raspberry_Pi .badge {
color: $primary-color;
}
@media only screen and (max-width: $palm-end) {
.getting-started-grid {
flex-direction: column;
}
.getting-started-device {
padding-bottom: 64px;
}
#HA_Yellow, #Raspberry_Pi {
padding-top: 0;
order: 2;
}
}
}
.sponsors-and-press {
margin-top: 24px;
text-align: center;
}
.seen-press {
@ -791,12 +986,6 @@ a.material-card:hover {
gap: 24px;
margin: 48px 0;
h2 {
grid-column: 1/-1;
margin: 0;
text-align: center;
}
a {
aspect-ratio: 1;
}
@ -861,7 +1050,6 @@ a.material-card:hover {
}
}
h1:hover a.title-link,
h2:hover a.title-link,
h3:hover a.title-link,
@ -889,11 +1077,28 @@ dt:hover a.title-link {
}
}
.hero-buttons a {
margin: 0 30px 10px 0;
.hero-github-badge .desktop {
display: none;
max-width: 658px;
width: 100%;
}
&:last-child {
margin: 0;
.hero-github-badge .mobile {
display: block;
max-width: 420px;
width: 100%;
margin-bottom: 2rem;
}
// after 768px, show desktop, hide mobile
@media only screen and (min-width: 1025px) {
.hero-github-badge .mobile {
display: none;
max-width: 385px;
}
.hero-github-badge .desktop {
display: block;
}
}
@ -925,7 +1130,11 @@ article.listing {
&>table,
&>.entry-content>table {
background-color: #fff;
display: block;
overflow-x: auto;
table-layout: auto;
width: fit-content;
max-width: 100%;
&>thead {
background-color: rgba(0, 0, 0, .025);
@ -1360,11 +1569,16 @@ a.my {
}
}
:target {
display: block;
// Prevent headings from disappearing behind the site header when linked to
h1, h2, h3, h4, h5, h6 {
position: relative;
top: -100px;
visibility: hidden;
word-wrap: break-word;
}
:target, .title-link {
display: inline-block;
position: relative;
scroll-margin-top: 140px;
}
.site-header {

View File

@ -0,0 +1,218 @@
// More specificity
#landingpage .page-content .content {
.ha-buy-dialog {
background: rgba(0, 0, 0, 0.4);
display: none;
inset: 0;
padding: 40px;
place-items: center;
position: fixed;
z-index: 1200;
&.open {
display: flex;
flex-direction: column;
}
&-inner {
background-color: #ffffff;
border-radius: 8px;
display: grid;
gap: 20px;
max-width: 624px;
padding: 20px;
width: 100%;
overflow: hidden;
}
&-header {
align-items: center;
display: flex;
.product-name {
flex-grow: 1;
font-size: 20px;
@media (min-width: 704px) {
font-size: 28px;
}
}
.close {
align-items: center;
cursor: pointer;
display: flex;
flex-shrink: 0;
}
}
&-content {
display: flex;
flex-direction: column;
gap: 20px;
max-height: 100%;
overflow: hidden;
@media (min-width: 704px) {
flex-direction: row;
}
}
&-sidebar {
background-color: #F0F0F3;
border-radius: 8px;
min-width: 140px;
padding: 12px;
&-label {
font-size: 14px;
font-weight: 700;
padding-bottom: 8px;
}
&-tabs {
display: flex;
flex-direction: row;
flex-wrap: wrap;
gap: 4px;
@media (min-width: 704px) {
flex-direction: column;
flex-wrap: nowrap;
}
}
&-tab {
background-color: transparent;
border-radius: 4px;
color: #4F606E;
cursor: pointer;
flex-basis: 40%;
flex-grow: 1;
font-size: 16px;
padding: 8px;
text-align: center;
transition: background-color 0.1s;
user-select: none;
@media (min-width: 704px) {
flex-basis: unset;
text-align: left;
}
&:hover {
background-color: #e1e1e1;
}
&.active {
background-color: #FCFCFF;
color: #000;
pointer-events: none;
}
}
}
&-tab {
&-content-wrapper {
flex-grow: 1;
height: 100%;
max-height: 475px;
overflow-y: auto;
}
&-content {
display: none;
flex-direction: column;
gap: 32px;
&.active {
display: flex;
}
}
}
&-distributor {
&-countries {
display: flex;
flex-direction: column;
gap: 18px;
}
&-country {
&-name {
align-items: center;
display: flex;
font-size: 14px;
font-weight: 700;
gap: 10px;
padding-bottom: 12px;
}
&-flag {
border-radius: 0;
height: 8px;
}
$letters: "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
@for $i from 1 through 26 {
$letter: str-slice($letters, $i, $i);
&[data-sort="#{$letter}"] {
order: $i;
}
}
}
&-items {
display: flex;
flex-wrap: wrap;
gap: 8px;
justify-content: center;
@media (min-width: 704px) {
gap: 20px;
justify-content: flex-start;
max-width: 400px;
}
}
&-item {
border: 1px solid #F0F0F3;
border-radius: 8px;
display: flex;
flex-direction: column;
gap: 8px;
height: 60px;
padding: 4px 16px;
place-items: center;
text-align: center;
text-decoration: none;
transition: background-color 0.1s;
width: 120px;
span {
color: #4F606E;
font-size: 10px;
height: 14px;
line-height: 1;
white-space: nowrap;
}
&:hover {
background-color: #F0F0F3;
}
}
&-logo {
border: unset;
border-radius: 0;
box-shadow: unset;
flex-grow: 1;
height: 100%;
max-height: 50px;
object-fit: contain;
overflow: hidden;
}
}
}
}

View File

@ -64,6 +64,11 @@ table {
}
}
.text-input,
textarea {
cursor: text;
}
.gist {
font-size: 0.75em;
}

View File

@ -152,7 +152,7 @@ header .grid {
.menu {
background: $white;
box-shadow: 0px 64px 32px rgba(0,0,0,.1);
max-height: 100vh;
max-height: calc(100vh - 68px);
overflow-y: auto;
}

View File

@ -1,50 +1,85 @@
.feature-cards {
display: grid;
letter-spacing: normal;
grid-template-columns: repeat(2, 1fr);
gap: 32px;
grid-template-columns: repeat(3, 1fr);
gap: 24px;
margin: auto;
.card {
border-radius: 8px;
border-radius: 24px;
background: white;
padding: 24px;
display: inline-block;
width: calc(100% - 16px);
vertical-align: top;
.card-header {
font-size: 1.4rem;
line-height: 1.6;
font-family: $heading-font;
font-size: 1.3125rem;
line-height: 1.625rem;
display: flex;
align-items: center;
padding-bottom: 8px;
height: 62px;
flex-direction: column;
padding-bottom: 16px;
color: $primary-color;
font-weight: 600;
iconify-icon {
font-size: 2.5rem;
margin-right: 8px;
border-radius: 64px;
background: var(--Light-primary-container, #CCEFFE);
align-self: flex-start;
padding: 16px;
margin-bottom: 12px;
color: rgba(0, 127, 168, 1);
}
}
.card-content {
padding-bottom: 24px;
font-size: 1rem;
p:last-of-type,
ul {
margin-bottom: 32px;
p {
margin-bottom: 12px;
}
p:last-of-type {
margin-bottom: 24px;
}
.button {
float: right;
font-size: 1rem;
padding: 8px 16px;
}
}
}
}
.sub-title {
letter-spacing: normal;
font-weight: bold;
font-size: 42px;
line-height: 49px;
margin: 32px;
font-family: $heading-font;
font-size: 6rem;
font-weight: 800;
line-height: normal;
letter-spacing: -1.92px;
margin: 96px 0 24px !important;
text-align: center;
}
.sub-title + p {
margin: -24px 0 48px 0;
}
@media only screen and (max-width: $lap-end) {
.feature-cards {
grid-template-columns: repeat(2, 1fr);
}
.sub-title {
font-size: 4rem;
line-height: 1.1 !important;
margin-bottom: 32px !important;
}
}
@media only screen and (max-width: $palm-end) {
.feature-cards {
width: 95%;

View File

@ -4,17 +4,17 @@
.hero {
position: relative;
background: rgb(24,188,242);
background: linear-gradient(0deg, hsl(195, 89%, 52%) 0%, hsla(195, 89%, 52%, 0.8) 100%);
background: linear-gradient(340deg, hsl(200deg, 100%, 50%) 0%, hsl(195deg, 100%, 50%) 50%, hsl(185deg, 100%, 50%) 100%);
padding-bottom: 0;
margin-top: -88px;
margin-bottom: 24px;
margin-bottom: 48px;
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;
min-height: 840px;
// scroll-snap-align: start;
color: $white;
@ -24,14 +24,20 @@
}
h1 {
font-size: 6em;
line-height: .8;
background: linear-gradient(135deg, rgba(255, 255, 255, 1) 0%, hsl(174.86, 100%, 75%) 100%);
font-size: 8rem;
font-style: normal;
font-weight: 800;
line-height: 1;
letter-spacing: -2.56px;
background: linear-gradient(125deg, #FFF 29.3%, #80FFF4 89.99%);
background-clip: text;
color: transparent;
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
.line2 {
line-height: 1.25;
margin-top: -1.75rem;
display: block;
}
}
@ -40,30 +46,103 @@
color: $grayLighter;
font-size: .65em;
}
.lead {
font-size: 1.25rem;
&.lead {
font-size: 1.5rem !important;
margin-bottom: 24px;
line-height: 2.25rem !important;
}
}
.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;
.hero-buttons {
display: flex;
margin: 8px 0px 24px 0px;
align-items: center;
gap: 12px;
&.primary {
background-color: $link-color;
font-size: 2rem;
a {
font-size: 1.1rem;
color: white;
white-space: nowrap;
display: inline-block;
font-weight: 600;
padding: 8px 0 8px 0;
margin: 0 12px 0 12px;
border-radius: 32px;
&.primary {
font-family: $heading-font;
background-color: $link-color;
text-transform: uppercase;
font-size: 1.5rem;
font-weight: 700;
padding: 8px 16px 8px 24px;
margin: 0;
}
}
}
.hero-welcome {
padding-left: 64px;
}
.hero-socialproof {
display: flex;
padding-top: 48px;
align-items: center;
gap: 32px;
a {
opacity: 0.75;
transition: .5s opacity;
&:hover {
opacity: 1;
}
}
}
.hero-github-top-project {
display: flex;
padding: 12px;
align-items: center;
gap: 10px;
border-radius: 12px;
border: 1px solid #F2F4F9;
width: 330px;
p {
color: #FFF;
font-size: 1rem;
font-weight: 400;
line-height: 1.25rem;
margin: 0;
strong {
font-weight: 600;
}
}
}
.hero-socialproof-asseenon {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
gap: 4px;
p {
margin: 8px 0 0 0;
align-self: stretch;
font-size: .875rem;
font-weight: 700;
padding: 8px 20px 8px 28px;
margin-bottom: 16px;
opacity: .75;
}
.logos {
display: flex;
align-items: center;
gap: 32px;
}
}
@ -81,22 +160,33 @@
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-name: floaty-demo;
// animation-duration: 4s;
// animation-iteration-count: infinite;
// animation-direction: alternate;
// animation-timing-function: linear;
// transform: rotateY(346deg) skewY(3deg);
@media only screen and (max-height: 720px) {
@media only screen and (max-height: 840px) {
border-bottom: 0;
margin-bottom: -8px;
border-radius: 48px 48px 0 0;
height: 640px;
height: 750px;
}
}
}
@keyframes floaty-demo {
from {
transform: translateY(-25px) rotateY(346deg) skewY(3deg);
}
to {
transform: translateY(0) rotateY(346deg) skewY(3deg);
}
}
@keyframes box-shadow-color {
from {
box-shadow: 24px 64px 64px hsla(240, 100%, 25%, .5);
@ -106,10 +196,85 @@
}
}
@media only screen and (max-width: $lap-end) {
@media only screen and (max-width: 1280px) {
.hero .hero-socialproof, .hero .hero-buttons {
flex-direction: column;
align-items: flex-start;
gap: 8px;
}
}
@media only screen and (max-width: 1240px) {
.hero {
h1 {
font-size: 4rem;
font-size: 6rem;
letter-spacing: -1.92px;
.line2 {
margin-top: -1rem;
}
}
p.lead {
font-size: 1.25rem !important;
line-height: 1.75rem !important;
}
.hero-buttons a {
font-size: 1rem;
}
}
.hero .hero-welcome {
padding-left: 48px;
}
}
@media only screen and (max-width: 1080px) {
.hero .hero-welcome {
padding-left: 24px;
}
}
@media only screen and (max-width: 760px) {
.hero {
text-align: center;
.hero-socialproof, .hero-buttons {
align-items: center;
}
min-height: 940px;
.flex {
flex-direction: column;
}
#HAdemo {
display: none;
}
#HAdemoScreenshot {
display: inline-block;
text-align: center;
padding-top: 48px;
}
}
}
@media only screen and (max-width: $lap-end) {
.hero {
img {
margin-bottom: 0 !important;
}
h1 {
font-size: 4.5rem;
letter-spacing: -1.92px;
.line2 {
margin-top: -1rem;
}
}
.lead {
@ -123,20 +288,3 @@
}
}
}
@media only screen and (max-width: 760px) {
.hero {
.flex {
flex-direction: column;
}
#HAdemo {
display: none;
}
#HAdemoScreenshot {
display: block;
}
}
}

View File

@ -5,22 +5,156 @@
font-weight: 500;
letter-spacing: .005em;
color: $gray;
padding-top: 8px;
text-transform: uppercase;
}
}
.component-search {
margin-bottom: 24px;
min-height: 80px;
input {
width: 100%;
padding: 10px;
background-color: #fefefe;
border-radius: 8px;
border: 1px solid;
border-color: #7c7c7c #c3c3c3 #ddd;
}
}
.grid-filters {
@media only screen and (min-width: $desk-start) {
display: flex;
}
}
.integration-filter-radio {
display: flex;
border: none;
padding: 0;
grid-gap: 10px;
}
.filter-button {
display: flex;
align-items: center;
margin-bottom: 0;
width: fit-content;
font-size: 1rem;
box-shadow: none;
background-color: $blueDark;
color: white;
border-radius: 24px;
input {
appearance: none;
-webkit-appearance: none;
-moz-appearance: none;
padding-left: 16px;
display: block;
margin-left: 10px;
flex-shrink: 0;
height: 1rem;
width: 1rem;
border-radius: 100%;
border-color: transparent;
background-color: white;
&:checked {
background-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2016%2016%22%20fill%3D%22%23007fa8%22%20transform%3D%22rotate(90)%22%3E%3Ccircle%20cx%3D%228%22%20cy%3D%228%22%20r%3D%223%22%2F%3E%3C%2Fsvg%3E");
}
}
label {
display: block;
width: 100%;
padding: 4px 16px 4px 10px;
}
}
.integration-filter.integration-filter-select {
position: relative;
&::after {
content: " ";
position: absolute;
top: 50%;
margin-top: 2px;
right: 8px;
width: 0;
height: 0;
border-left: 5px solid transparent;
border-right: 5px solid transparent;
border-top: 5px solid black;
}
.ha_category {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
color: #222;
width: 100%;
margin-bottom: 15px;
text-align-last: center;
font-size: 16px;
line-height: 24px;
border: 2px solid $blueDark;
border-top-right-radius: 0px;
border-top-left-radius: 0px;
border-bottom-right-radius: 5px;
border-bottom-left-radius: 5px;
border-top: 0;
position: relative;
top: -2px;
padding: 5px 5px 2px;
&:focus-visible {
outline: none;
}
}
}
.filter-title {
background: $blueDark;
color: white;
text-align: center;
border-top-right-radius: 5px;
border-top-left-radius: 5px;
padding: 5px;
margin-top: 0;
margin-bottom: -2px;
text-transform: capitalize;
font-size: 18px;
position: relative;
z-index: 1;
}
.active-filter {
margin: 10px 5px 0px 0px;
padding: 5px 10px;
min-width: 100px;
background-color: $blueDark;
border-radius: 28px;
border: none;
color: white;
font-size: 14px;
letter-spacing: 0.5px;
text-transform: capitalize;
line-height: 18px;
span {
display: flex;
align-items: center;
}
iconify-icon {
display: inline-block;
margin-left: 5px;
}
}
select {
font-family: $sans-serif;
border: 0;
@ -44,6 +178,10 @@
width: 100%;
}
div.alert {
text-align: center;
}
.option-card {
flex: 0 0 auto;
aspect-ratio: 1;
@ -147,7 +285,7 @@ a.option-card:hover {
img {
max-width: 48px;
max-height: 48px;
}
}
}
.title {
@ -201,7 +339,7 @@ a.option-card:hover {
}
.category_select {
display: block;
}
}
.category_list {
display: none;
}
@ -330,4 +468,4 @@ a.option-card:hover {
to {
opacity: 0;
}
}
}

View File

@ -188,6 +188,11 @@ $ha__primary_color: #03a9f4;
width: 330px;
}
.button{
display: inline-block;
padding: 8px 24px;
}
.title {
margin-bottom: 4px;
}
@ -844,6 +849,7 @@ $ha__primary_color: #03a9f4;
margin: auto;
summary.region {
cursor: pointer;
display: list-item;
}
}

View File

@ -156,6 +156,7 @@ Screenshot of a vertical stack card with 4 buttons and an entity selector.
The image shows a vertical stack card with 4 buttons arranged in a horizontal stack card and an entity selector. The buttons use the toggle action to run a script, for example, the Netflix script, which starts up the TV and opens Netflix. To learn how to create scripts, refer to [scripts](/docs/scripts/).
```yaml
type: vertical-stack
cards:
- entities:
- entity: input_select.living_room_scene
@ -201,5 +202,4 @@ cards:
action: more-info
show_name: true
show_icon: true
type: vertical-stack
```

View File

@ -6,7 +6,7 @@ description: The Conditional card displays another card based on conditions.
related:
- docs: /dashboards/cards/
title: Dashboard cards
- docs: /dashboards/cards/#showing-or-hiding-a-card-conditionally
- docs: /dashboards/cards/#showing-or-hiding-a-card-or-badge-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/#showing-or-hiding-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-or-badge-conditionally) tab.
Most options for this card can be configured via the user interface.

View File

@ -234,3 +234,50 @@ The following example limits the number of shown devices to 5:
type: energy-devices-detail-graph
max_devices: 5
```
## Sankey energy graph
<p class='img'>
<img src='/images/dashboards/energy/sankey.png' alt='Screenshot of the sankey energy graph card'>
Screenshot of the sankey energy graph card.
</p>
The sankey energy graph shows the flow of energy in your home. It starts with sources and flows into the various consumers. Devices are grouped into floors and areas if these are configured.
### Examples
```yaml
type: energy-sankey
```
The following example orients the flow from top to bottom:
```yaml
type: energy-sankey
layout: vertical
```
## Using Multiple Collections
By default, all energy cards are linked to any `energy-date-selection` card on the view, and all `energy-date-selection` cards are linked to the same period. To enable multiple different date selections on the same view, it is necessary to link them to different collections. This is done by adding the variable `collection_key` to the card YAML, and giving this a value of any custom string that begins with `energy_`. (strings that do not start with `energy_` will generate an error).
All energy cards support use of `collection_key` option.
### Examples
Example view with multiple collections:
```yaml
type: masonry
path: example
cards:
- type: energy-date-selection
- type: energy-date-selection
collection_key: energy_2
# This card is linked to the first (default) date selection
- type: energy-usage-graph
# This card is linked to the second date selection
- type: energy-usage-graph
collection_key: energy_2
```

View File

@ -115,6 +115,10 @@ double_tap_action:
required: false
description: Action taken on row double tap. See [action documentation](/dashboards/actions/#double-tap-action).
type: map
confirmation:
required: false
description: For entities that display a button element in the row (for example, button, lock, script), this option adds a confirmation dialog to the press of the button. See [options for confirmation](/dashboards/actions/#options-for-confirmation) for configuration options.
type: map
{% endconfiguration %}
## Special row elements

View File

@ -95,7 +95,7 @@ state_filter:
## Conditions options
You can specify multiple `conditions`, in which case the entity will be displayed if it matches any condition.
You can specify multiple `conditions`, in which case the entity will be displayed if it matches every condition.
### State
@ -145,6 +145,10 @@ state_not:
required: false
description: Entity state or ID to not be equal to this value. Can contain an array of states.*
type: [list, string]
entity:
required: false
description: An optional entity ID to be used for testing the state condition. If not provided, the state of the entity being displayed is tested.
type: string
{% endconfiguration %}
*one is required (`state` or `state_not`)
@ -178,6 +182,10 @@ below:
required: false
description: Entity state or ID to be below this value.*
type: string
entity:
required: false
description: An optional entity ID to be used for testing the numeric state condition. If not provided, the numeric state of the entity being displayed is tested.
type: string
{% endconfiguration %}
*at least one is required (`above` or `below`), both are also possible for values between.

View File

@ -115,15 +115,6 @@ double_tap_action:
type: map
{% endconfiguration %}
### Options for exemptions
{% configuration badges %}
user:
required: true
description: User ID that can see the view tab.
type: string
{% endconfiguration %}
### Examples
Basic example:

View File

@ -0,0 +1,119 @@
---
type: card
title: "Heading card"
sidebar_label: Heading
description: "The Heading card structures your dashboard by providing title, icon, navigation and badges."
related:
- docs: /dashboards/actions/
title: Card actions
- docs: /dashboards/cards/
title: Dashboard cards
---
The Heading card structures your dashboard by providing title, icon and navigation. This card supports [actions](/dashboards/actions/).
<p class='img'>
<img src='/images/dashboards/heading_card.png' alt='Screenshot of heading cards'>
Screenshot of a heading card with a title, badges, and a subtitle.
</p>
```yaml
type: heading
heading: Living room
icon: mdi:sofa
badges:
- type: entity
entity: sensor.living_room_sensor_temperature
color: red
- type: entity
entity: sensor.living_room_sensor_humidity
color: deep-purple
```
{% configuration entity %}
type:
required: true
description: "`heading`"
type: string
heading:
required: false
description: Heading text
type: string
heading_style:
required: false
description: Style of the heading. Can be either `title` or `subtitle`.
type: string
default: title
icon:
required: false
description: Icon displayed before the heading text.
type: string
tap_action:
required: false
description: Action taken on card tap. See [action documentation](/dashboards/actions/#tap-action). By default, it will do nothing. If an action is configured, a chevron will appear next to the heading text.
type: map
badges:
required: false
description: Additional small badges to display entity information. See [heading badges](/dashboards/heading/#heading-badges).
type: list
{% endconfiguration %}
## Heading badges
In addition to the heading text, each heading card can show small badges. They are smaller than regular [badges](/dashboards/badges/) and don't have a background. The heading badges can display sensor information in a compact and minimal style. Heading badges also support [actions](/dashboards/actions/).
```yaml
type: entity
entity: light.living_room
```
{% configuration entity %}
type:
required: true
description: "`entity`"
type: string
entity:
required: true
description: Entity ID.
type: string
name:
required: false
description: Overwrites the entity name. The name will be only displayed if `state_content` includes `name` token.
type: string
icon:
required: false
description: Overwrites the entity icon.
type: string
color:
required: false
description: Set the color when the entity is active. By default, it will not be colored. It can be set to the `state` special token to dynamically color the icon based on `state`, `domain`, and `device_class` of your entity. It also accepts [color token](/dashboards/tile/#available-colors) or hex color code.
type: string
default: none
show_icon:
required: false
description: Show the icon
type: boolean
default: "true"
show_state:
required: false
description: Show the state.
type: boolean
default: "false"
state_content:
required: false
description: >
Content to display for the state. Can be `state`, `name`, `last_changed`, `last_updated`, or any attribute of the entity. Can be either a string with a single item, or a list of string items. Default depends on the entity domain.
type: [string, list]
tap_action:
required: false
description: Action taken on card tap. See [action documentation](/dashboards/actions/#tap-action). By default, it will do nothing.
type: map
hold_action:
required: false
description: Action taken on card hold. See [action documentation](/dashboards/actions/#hold-action). By default, it will do nothing.
type: map
double_tap_action:
required: false
description: Action taken on card double tap. See [action documentation](/dashboards/actions/#double-tap-action). By default, it will do nothing.
type: map
{% endconfiguration %}

View File

@ -71,6 +71,11 @@ fit_y_data:
description: If true, configured Y-axis bounds would automatically extend (but not shrink) to fit the data.
type: boolean
default: false
expand_legend:
required: false
description: If true, the legend will show all items initially
type: boolean
default: false
{% endconfiguration %}
### Options for entities

View File

@ -61,6 +61,11 @@ allow:
description: The [Permissions Policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Permissions-Policy#iframes) of the iframe, that is, the value of the [`allow`](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#allow) attribute.
type: string
default: "fullscreen"
disable_sandbox:
required: false
description: Disables the [sandbox](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/iframe#attr-sandbox) attribute of the iframe, e.g. required for Chrome when viewing PDFs. This is less secure and should only be used if you trust the content of the iframe.
type: boolean
default: false
{% endconfiguration %}
### Examples

View File

@ -2,7 +2,7 @@
type: card
title: "Logbook card"
sidebar_label: Logbook
description: "The logbook card displays entries from the logbook for specific entities."
description: "The logbook card displays entries from the logbook for specific entities, devices, areas, and/or labels."
related:
- docs: /integrations/frontend/
title: Themes
@ -10,7 +10,7 @@ related:
title: Dashboard cards
---
The logbook card displays entries from the logbook for specific entities.
The logbook card displays entries from the logbook for specific entities, devices, areas, and/or labels.
<p class='img'>
<img src='/images/dashboards/logbook.png' alt='Screenshot of the logbook card'>
@ -22,8 +22,8 @@ The logbook card displays entries from the logbook for specific entities.
## Card settings
{% configuration_basic %}
Entities:
description: The entities whose logbook entries will show in the card.
Target:
description: The entities, devices, areas and labels whose logbook entries will show in the card. See [target selector](/docs/blueprint/selectors/#target-selector) for more information.
Title:
description: The title that shows on the top of the card.
Hours to show:
@ -41,10 +41,10 @@ type:
required: true
description: "`logbook`"
type: string
entities:
target:
required: true
description: The entities that will show in the card.
type: list
description: The target to use for the card.
type: map
title:
required: false
description: Title of the card.
@ -64,9 +64,24 @@ theme:
```yaml
type: logbook
entities:
- fan.ceiling_fan
- fan.living_room_fan
- light.ceiling_lights
target:
entity_id:
- fan.ceiling_fan
- fan.living_room_fan
- light.ceiling_lights
hours_to_show: 24
```
```yaml
type: logbook
target:
area_id: living_room
device_id:
- ff22a1889a6149c5ab6327a8236ae704
- 52c050ca1a744e238ad94d170651f96b
entity_id:
- light.hallway
- light.landing
label_id:
- lights
```

View File

@ -10,18 +10,42 @@ related:
title: Themes
- docs: /dashboards/cards/
title: Dashboard cards
- docs: /docs/configuration/basic/#editing-the-general-settings
title: Edit your home location
- docs: /getting-started/presence-detection/
title: Getting started tutorial on presence detection
---
The map card that allows you to display entities on a map. This card is used on the [Map dashboard](/dashboards/dashboards/#map-dashboard), which is one of the default dashboards.
The map card allows you to display your home zone, entities, and other predefined zones on a map. This card is used on the [Map dashboard](/dashboards/dashboards/#map-dashboard), which is one of the default dashboards.
<p class='img'>
<img src='/images/dashboards/map_card.png' alt='Screenshot of the map card'>
<img src='/images/dashboards/map_card.webp' alt='Screenshot of the map card'>
Screenshot of the map card.
</p>
{% include dashboard/edit_dashboard.md %}
## Adding the map card to your dashboard
All options for this card can be configured via the user interface.
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.
- Once you've taken control, you can't set this dashboard to update automatically anymore. However, you can create a new default dashboard.
- To continue, in the dialog, select the three dots {% icon "mdi:dots-vertical" %} menu, then select **Take control**.
2. [Add the map card](/dashboards/cards/#adding-cards-to-your-dashboard) to your dashboard.
3. By default, you see the house {% icon "mdi:house" %} icon on your map. It represents your [home zone](/integrations/zone/#about-the-home-zone).
- To change the location of your home, you need to [edit your home's location in the general settings](/docs/configuration/basic/#editing-the-general-settings).
![Edit map card settings](/images/dashboards/map_card_config.png)
4. To learn how to show additional zones on your map, follow the steps on [adding a new zone](/integrations/zone/#adding-a-new-zone-or-editing-zones).
5. To show other elements on the map, either add them under **Entities**, or use the **Geolocation sources**.
- For a description of the options, refer to the [YAML configuration](#yaml-configuration) section. It also applies to the options shown in the UI.
- {% icon "mdi:info" %} **Info**: The list of entities shows the device trackers available for your home, such as a mobile phone with the companion app.
- If you want to see a trace of the past locations of your entities, you need to define a time frame under **Hours to show**.
- For more information about presence detection, refer to the [getting started tutorial on presence detection](/getting-started/presence-detection/).
## Configuration options
All options for this card can be configured via the user interface. For a detailed description of the options, refer to the [YAML configuration](#yaml-configuration) section. It also applies to the options shown in the UI.
## YAML configuration
@ -33,16 +57,21 @@ type:
description: "`map`"
type: string
entities:
required: true
description: List of entity IDs or `entity` objects (see below). Either this or the `geo_location_sources` configuration option is required.
required: false
description: List of entity IDs or `entity` objects (see [below](#options-for-entities)). Either this, `show_all`, or the `geo_location_sources` configuration option is required.
type: list
geo_location_sources:
required: true
description: List of geolocation sources. All current entities with that source will be displayed on the map. See [Geolocation](/integrations/geo_location/) platform for valid sources. Set to `all` to use all available sources. Either this or the `entities` configuration option is required.
required: false
description: List of geolocation sources or `source` objects (see [below](#options-for-geolocation-sources)). All current entities with that source will be displayed on the map. See [Geolocation](/integrations/geo_location/) platform for valid sources. Set to `all` to use all available sources. Either this, `show_all`, or the `entities` configuration option is required.
type: list
show_all:
required: false
description: Automatically add all entities with coordinates to the map card. (Default behavior of Map panel)
type: boolean
default: false
auto_fit:
required: false
description: The map will follow moving `entities` by adjusting the viewport of the map each time an entity is updated.
description: The map will follow moving `entities` by adjusting the viewport of the map each time an entity is updated.
type: boolean
default: false
fit_zones:
@ -60,7 +89,7 @@ aspect_ratio:
type: string
default_zoom:
required: false
description: The default zoom level of the map.
description: The default zoom level of the map. Use a lower number to zoom out and a higher number to zoom in.
type: integer
default: 14 (or whatever zoom level is required to fit all visible markers)
theme_mode:
@ -101,7 +130,11 @@ name:
label_mode:
required: false
default: name
description: When set to `state`, renders the entity's state as the label for the map marker instead of the entity's name. This option doesn't apply to [zone](/integrations/zone/) entities because they don't use a label but an icon.
description: When set to `icon`, renders the entity's icon in the marker instead of text. When set to `state` or `attribute`, renders the entity's state or attribute as the label for the map marker instead of the entity's name. This option doesn't apply to [zone](/integrations/zone/) entities because they don't use a label but an icon.
type: string
attribute:
required: false
description: An entity's attribute when `label_mode` set to `attribute`.
type: string
focus:
required: false
@ -110,6 +143,31 @@ focus:
type: boolean
{% endconfiguration %}
## Options for geolocation sources:
If you define geolocation sources as objects instead of strings (by adding `source:` before the ID), you can add more customization and configuration.
{% configuration %}
source:
required: true
description: Name of a geolocation source, or `all`.
type: string
label_mode:
required: false
default: name
description: When set to `icon`, renders the entity's icon in the marker instead of text. When set to `state` or `attribute`, renders the entity's state or attribute as the label for the map marker instead of the entity's name. This option doesn't apply to [zone](/integrations/zone/) entities because they don't use a label but an icon.
type: string
attribute:
required: false
description: An entity's attribute when `label_mode` set to `attribute`.
type: string
focus:
required: false
default: true
description: When set to `false`, the entities of this source will not be considered for determining the default zoom or fit of the map.
type: boolean
{% endconfiguration %}
## Examples
```yaml
@ -126,6 +184,8 @@ entities:
type: map
geo_location_sources:
- nsw_rural_fire_service_feed
- source: gdacs
focus: false
entities:
- zone.home
```
@ -139,4 +199,3 @@ entities:
focus: false
hours_to_show: 48
```

View File

@ -58,6 +58,11 @@ show_empty:
description: By default, an empty card will still be shown (resulting in a small empty box). Setting this to `false` hides that empty card instead.
default: true
type: boolean
text_only:
required: false
description: Display the card without border, background, padding and title.
default: false
type: boolean
{% endconfiguration %}
### Example
@ -129,7 +134,6 @@ content: |
{% endraw %}
## ha-alert
You can also use our [\`ha-alert\`](https://design.home-assistant.io/#components/ha-alert) component in the Markdown card.
@ -150,3 +154,33 @@ content: |
<ha-alert alert-type="success">This is a success alert — check it out!</ha-alert>
<ha-alert title="Test alert">This is an alert with a title</ha-alert>
```
## ha-qr-code
You can also create QR-Codes in the Markdown card.
<p class='img'>
<img src='/images/dashboards/markdown_card_qr_code.png' alt='Screenshot of the markdown card with QR codes'>
Screenshot of the Markdown card with QR codes.
</p>
Available parameters:
- data: The actual data to encode in the QR-Code
- scale: A scale factor for the QR code, default is 4
- width: Width of the QR code in pixels
- margin: A margin around the QR code
- error-correction-level: low; medium; quartile; high
- center-image: An image to place on top of the qr code (might need a higher error-correction-level)
```yaml
type: markdown
content: >-
<ha-qr-code data='hallo' width="180"></ha-qr-code>
<ha-qr-code data='hallo' scale="6" margin="0"
center-image="/static/icons/favicon-192x192.png"></ha-qr-code>
<ha-qr-code data='hallo' error-correction-level="quartile" scale="6"
center-image="https://brands.home-assistant.io/_/tuya/icon@2x.png"></ha-qr-code>
```

View File

@ -1,7 +1,7 @@
---
type: view
title: Masonry view
sidebar_label: Masonry (default)
sidebar_label: Masonry
description: "The default panel layout uses a masonry algorithm."
related:
- docs: /dashboards/panel/
@ -10,14 +10,14 @@ related:
title: Sidebar view
---
The masonry view is the default view type.
The masonry view sorts cards in columns based on their card size.
<p class='img'>
<img src='/images/getting-started/lovelace.png' alt='Screenshot of the masonry view'>
Screenshot of the masonry view.
</p>
Masonry sorts cards in columns based on their card size. The next card is placed below the smallest card on the dashboard.
Masonry sorts cards in columns based on size and places the next card below the smallest card on the dashboard.
<p class='img'>
<img src='/images/dashboards/masonry.png' alt='Image showing how masonry arranges cards based on size.'>

View File

@ -407,15 +407,6 @@ style:
default: "position: absolute, transform: translate(-50%, -50%)"
{% endconfiguration %}
## Options for exemptions
{% configuration badges %}
user:
required: true
description: User ID that can see the view tab.
type: string
{% endconfiguration %}
## Notes on element attributes
### How to use the style object

View File

@ -143,15 +143,6 @@ double_tap_action:
type: map
{% endconfiguration %}
### Options for exemptions
{% configuration badges %}
user:
required: true
description: User ID that can see the view tab.
type: string
{% endconfiguration %}
### How to use state_filter
Specify different [CSS filters](https://developer.mozilla.org/en-US/docs/Web/CSS/filter)

View File

@ -1,7 +1,7 @@
---
type: view
title: Sections (experimental)
sidebar_label: Sections (experimental)
title: Sections
sidebar_label: Sections (default)
description: "Lets you organize your cards in sections on a grid."
description: "The panel view shows a single card in the full width of the screen."
related:
@ -23,45 +23,60 @@ The sections view lets you organize your cards in sections on a grid.
You can group cards without using horizontal or vertical stack cards.
<p class='img'>
<img src="/images/blog/2024-03-dashboard-chapter-1/sections-example-dashboard.png" alt="A fully populated dashboard in Sections view layout"/>
<img src="/images/dashboards/section_view.png" alt="A fully populated dashboard in Sections view layout"/>
A fully populated dashboard in Sections view layout
</p>
{% 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
1. If you have multiple dashboards, in the left sidebar, select the dashboard to which you want to add the sections view.
2. Follow the steps on [adding a new view](/dashboards/views/#adding-a-view-to-a-dashboard).
- Under **View type**, select **Sections (experimental)**.
3. Select the maximum number of columns you want to see in the new sections view.
4. When you are done, select **Save**.
- Under **View type**, select **Sections**.
3. Under **Max number of sections wide**, select the maximum number of columns you want to see in the new sections view.
4. Under **Dense section placement**, select if you want to allow the cards to be arranged automatically in order to fill gaps between cards.
- This will remove some gaps, but it also means you have less control over the order of the cards.
- Note that this only applies to horizontal gaps if you used sections more than one column wide.
5. When you are done, select **Save**.
- You are now presented with a new, empty view.
- If you chose a background image, the page is filled with that image.
6. Once you have created a sections view, you can start curating it:
- [Add sections and cards](#adding-sections-and-cards-to-a-sections-view).
- [Rearrange](#rearranging-sections-and-cards) and [show or hide sections conditionally](#show-or-hide-section-conditionally).
- [Add a dashboard header with a title and badges](#editing-the-header).
## Editing the header
<p class='img'>
<img src="/images/dashboards/sections_view_header_edit.png" alt="Editing the header"/>
Editing the header
</p>
1. To add a title, select the **Add title** button. The title supports [Markdown](https://commonmark.org/help/) and [templating](/docs/configuration/templating/).
2. To add badges, elect the **Add badge** button. Follow [steps on adding badges](/dashboards/badges) to see the different possible options.
3. To change the title and badges disposition, select the edit {% icon "mdi:edit" %} button to access header settings.
![Edit view heading section button](/images/dashboards/sections_view_header_editor.png)
## Adding sections and cards to a sections view
Once you have created a sections view, you can populate it with sections and cards. The new section comes with one section to which you can directly add a card.
The view comes with one section to which you can directly add a card.
1. To add a card, select the **Add card** button.
- Follow the [steps on adding cards](/dashboards/cards/#adding-cards-to-your-dashboard).
![Add Section button](/images/dashboards/sections_view_add-card-or-section.png)
![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 edit {% icon "mdi:edit" %} button.
- If you leave the section title empty, this line will be hidden.
3. A [heading card](/dashboards/heading) will be automatically added to the top of the section.
- To edit it, select the card.
- If you don't want a heading title at the top of the section, delete this card.
- The title can be added again later, like any other card.
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**.
- 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.
![Define visibility](/images/dashboards/section-visibility.png)
## Deleting a section
1. To delete a section, go to the dashboard and in the top right corner, select the edit {% icon "mdi:edit" %} button.
@ -76,15 +91,15 @@ In the sections view, you can rearrange sections and cards by dragging them to a
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"/>
Rearranging sections by dragging
<img src="/images/dashboards/section_view_rearrange_sections.gif" alt="Rearranging sections by dragging"/>
Rearranging sections by dragging
</p>
3. To rearrange cards, tap and hold the card and move it to your desired location.
<p class='img'>
<img src="/images/blog/2024-03-dashboard-chapter-1/drag-and-drop-cards.gif" alt="Rearranging cards by dragging"/>
Rearranging cards by dragging
<p class='img'>
<img src="/images/dashboards/section_view_rearrange_cards.gif" alt="Rearranging cards by dragging"/>
Rearranging cards by dragging
</p>
## Show or hide section conditionally
@ -111,3 +126,22 @@ type:
description: "`sections`"
type: string
{% endconfiguration %}
## Header YAML configuration
{% configuration %}
layout:
required: false
description: Layout of the different elements. Can be `start`, `center`, or `responsive`. `responsive` is the same as `start` on mobile devices. It places badges and title side by side on desktop.
type: string
default: center
badges_position:
required: false
description: Badges position. Can be `bottom` or `top`.
type: string
default: bottom
card:
required: true
description: Card to be used as title. If you are configuring the view using the visual editor, the configuration of the [Markdown card](/dashboards/markdown) is used.
type: map
{% endconfiguration %}

View File

@ -8,6 +8,10 @@ related:
title: Masonry view
- docs: /dashboards/panel/
title: Panel view
- docs: /dashboards/sections/
title: Sections view (default)
- docs: /dashboards/views/
title: About views
---
The sidebar view has 2 columns, a wide one and a smaller one on the right.
@ -17,18 +21,24 @@ The sidebar view has 2 columns, a wide one and a smaller one on the right.
Screenshot of the sidebar view used for the energy dashboard.
</p>
This view doesn't have support for badges.
You can set if a card should be placed in the main (left) column of the sidebar column (right), by selecting the arrow right or left arrow in the bar underneath the card.
To move the card from the main column into the sidebar (right) (and vice versa), select the arrow {% icon "mdi:arrow-left-bold" %} {% icon "mdi:arrow-right-bold" %} button on the card.
<p class='img'>
<img src='/images/dashboards/sidebar_view_move_card.png' alt='Screenshot showing how to move a card between sidebar and main view'>
Screenshot showing how to move a card between sidebar and main view.
<img src='/images/dashboards/sidebar_view_move_card.png' alt='Screenshot showing how to move a card'>
Screenshot showing the arrow buttons to move a card.
</p>
On mobile, all cards are rendered in 1 column and kept in the order of the cards in the config.
On mobile, all cards are rendered in 1 column and kept in the order indicated in the YAML configuration.
## View config:
1. To view the YAML configuration, on the view tab, select the {% icon "mdi:pencil" %} icon to open the edit view.
2. In the configuration dialog, select the three dots {% icon "mdi:dots-vertical" %} menu, and **Edit in YAML**.
<p class='img'>
<img src='/images/dashboards/view_edit_config.png' alt='Screenshot showing where to edit the view configuration'>
Screenshot showing where to edit the view configuration.
</p>
## View configuration
{% configuration %}
type:
@ -37,7 +47,7 @@ type:
type: string
{% endconfiguration %}
## Cards config:
## Cards configuration
{% configuration %}
view_layout.position:
@ -58,4 +68,4 @@ cards:
- media_player.lounge_room
view_layout:
position: sidebar
```
```

View File

@ -64,6 +64,10 @@ footer:
required: false
description: Footer widget to render. See [footer documentation](/dashboards/header-footer/).
type: map
collection_key:
required: false
description: "If using `period: energy_date_selection`, you can set a custom key to match the optional key of an `energy-date-selection` card. This is not typically required, but can be useful if multiple date selection cards are used on the same view. See [energy documentation](/dashboards/energy/#using-multiple-collections)."
type: string
{% endconfiguration %}
## Example
@ -81,7 +85,7 @@ stat_type: change
## Options for period
Periods can be configured in 3 different ways:
Periods can be configured in 4 different ways:
### Calendar
@ -177,3 +181,16 @@ period:
seconds: -10
stat_type: change
```
### Dynamic date selection
When placed on a view with an Energy date selection card, the statistic card can be linked to show data from the period selected on the date selection card.
Example of a period from the date selector:
```yaml
type: statistic
entity: sensor.energy_consumption
period: energy_date_selection
stat_type: change
```

View File

@ -62,7 +62,7 @@ title:
type: string
period:
required: false
description: The period of the rendered graph. `5minute`, `hour`, `day`, `week` or `month`
description: The period of the rendered graph. `5minute`, `hour`, `day`, `week` or `month`. If `energy_date_selection` is true, and `period` is not defined, the chart period will auto-select between month/day/hour based on the selected date range.
type: string
hide_legend:
required: false
@ -74,6 +74,33 @@ logarithmic_scale:
description: If true, numerical values on the Y-axis will be displayed with a logarithmic scale.
type: boolean
default: false
min_y_axis:
required: false
description: Lower bound for the Y-axis range.
type: float
max_y_axis:
required: false
description: Upper bound for the Y-axis range.
type: float
fit_y_data:
required: false
description: If true, configured Y-axis bounds would automatically extend (but not shrink) to fit the data.
type: boolean
default: false
expand_legend:
required: false
description: If true, the legend will show all items initially
type: boolean
default: false
energy_date_selection:
required: false
description: If true, chart date range will follow the date selected on an `energy-date-selection` card on the same view, similar to energy cards.
type: boolean
default: false
collection_key:
required: false
description: If using `energy_date_selection`, you can set a custom key to match the optional key of an `energy-date-selection` card. This is not typically required, but can be useful if multiple date selection cards are used on the same view.
type: string
{% endconfiguration %}
### Options for entities

View File

@ -12,11 +12,12 @@ related:
title: Dashboard cards
---
The tile card gives you a quick overview of your {% term entity %}. The card allows you to toggle the {% term entity %} and show the more info dialog. A badge is shown for some {% term entities %} like the [climate](/integrations/climate) or [person](/integrations/person) {% term entities %}.
The tile card gives you a quick overview of your {% term entity %}. The card allows you to add tap actions, and features to control the entity. You can also select the {% term entity %} to open the more info dialog. A badge is shown for some {% term entities %} like the [climate](/integrations/climate) or [person](/integrations/person) {% term entities %}.
<p class='img'>
<img src='/images/dashboards/tile_card.png' alt='Screenshot of tile cards'>
Screenshot of tile cards.
<img src='/images/dashboards/tile_card_tap_action.webp' alt='Screenshot of tile cards'>
The circular background behind an icon indicates that there is a tap action.
The "Downstairs" and "Upstairs" climate entities have a badge and a feature that is bottom-aligned.
</p>
{% include dashboard/edit_dashboard.md %}
@ -91,6 +92,12 @@ features:
required: false
description: Additional widgets to control your entity. See [available features](/dashboards/features).
type: list
features_position:
required: false
description: Position of the features on the tile card. Can be `bottom` or `inline`. Only the first feature will be displayed when the option is set to `inline`. `inline` is not compatible with the `vertical` option.
type: string
default: bottom
{% endconfiguration %}
## Examples
@ -145,15 +152,4 @@ features:
You want to colorize the tile card? Choose one of the following colors: `primary`, `accent`, `disabled`, `red`, `pink`, `purple`, `deep-purple`, `indigo`, `blue`, `light-blue`, `cyan`, `teal`, `green`, `light-green`, `lime`, `yellow`, `amber`, `orange`, `deep-orange`, `brown`, `grey`, `blue-grey`, `black` and `white`.
## Reordering features
Some features of the tile card, such as the presets or the HVAC modes of a
thermostat, can show many buttons. While you can limit the buttons youd
like to see, they may not be in the desired order.
For your thermostat, that means you can reorder the HVAC modes or presets.
<p class='img'>
<img src="/images/blog/2024-05/tile-card-reorder-features.gif" alt=" Screen recording showing how you can now reorder the HVAC modes on the thermostat shown in a tile card."/>
You can now reorder the features of the tile card.
</p>

View File

@ -61,6 +61,21 @@ theme:
required: false
description: Override the used theme for this card with any loaded theme. For more information about themes, see the [frontend documentation](/integrations/frontend/).
type: string
hide_completed:
required: false
description: Hide the completed items section in the card.
type: boolean
default: "false"
hide_create:
required: false
description: Hide the textbox for creating new tasks at the top of the card.
type: boolean
default: "false"
display_order:
required: false
description: "Optionally sorts the items in the to-do list for display. Options are: `none`: Show the list in its original order. `alpha_asc`: Sort the list in alphabetical order. `alpha_desc`: Sort the list in reverse alphabetical order. `duedate_asc`: Sort the list by due date (soonest first). `duedate_desc`: Sort the list by reverse due date (soonest last)."
type: string
default: "none"
{% endconfiguration %}
### Examples
@ -69,6 +84,6 @@ Title example:
```yaml
type: todo-list
entity: todo-list
title: todo list
entity: todo.todo_list
title: Todo List
```

View File

@ -10,6 +10,11 @@ related:
The vertical stack card allows you to group multiple cards so they always sit in the same column.
<p class='img'>
<img src='/images/dashboards/edit-dashboard.webp' alt='Screencast showing how to edit a dashboard customize a vertical stack card'>
Screencast showing how to edit a dashboard and customize a vertical stack card.
</p>
{% include dashboard/edit_dashboard.md %}
## YAML configuration

View File

@ -87,23 +87,33 @@
A binary sensor returns information about things that only have two states -
such as on or off.
link: /integrations/binary_sensor
aliases:
- binary_sensor
- binary_sensors
- term: Blueprint
definition: >-
A blueprint is a script or automation configuration with certain parts
marked as configurable. This allows users to create multiple scripts or
automations based on the same blueprint, with each having its own
A blueprint is a script, automation or template entity configuration with certain parts
marked as configurable. This allows users to create multiple scripts,
automations or template entities based on the same blueprint, with each having its own
configuration-specific settings. Blueprints are shared by the community on
the [blueprints
exchange](https://community.home-assistant.io/c/blueprints-exchange/53) in
the forum.
link: /docs/blueprint/
excerpt: >-
A blueprint is a script or automation configuration with certain parts
marked as configurable. This allows users to create multiple scripts or
automations based on the same blueprint, with each having its own
A blueprint is a script, automation or template entity configuration with certain parts
marked as configurable. This allows users to create multiple scripts,
automations or template entities based on the same blueprint, with each having its own
configuration-specific settings.
aliases:
- blueprints
- term: Button
definition: >-
A button entity can fire an event, or trigger an action towards a device or
service. It can be compared to a physical push button. The button entity does not have a state like `on` or `off`, but keeps the timestamp of when it was last pressed in the Home Assistant UI or via an action.
link: /integrations/button
aliases:
- buttons
- term: Category
definition: >-
A category is an organization tool that allows grouping items in a table.
@ -114,6 +124,13 @@
have different categories than the scene, scripts, or helpers settings page.
aliases:
- categories
- term: Climate
definition: >-
The Climate entity allows you to control and monitor HVAC (heating,
ventilating, and air conditioning) devices and thermostats.
link: /integrations/climate
aliases:
- climates
- term: Commissioning
definition: >-
In the context of Matter devices, *commissioning* is the process of adding a
@ -155,9 +172,13 @@
Covers are devices such as blinds, garage doors, etc that can be opened and
closed and optionally set to a specific position.
link: /integrations/cover
aliases:
- covers
- term: Custom integration
definition: >-
A custom integration is an integration that has been created by someone from the Home Assistant community and has been published for others to use at their own risk. Custom integrations are not supported by the Home Assistant project. They are not reviewed or tested by the Home Assistant development team and thus may negatively impact the stability of your Home Assistant instance. An example of a custom integration is the [Spook](https://spook.boo/) integration.
aliases:
- custom integrations
- term: Customize
definition: >-
Customization allows you to overwrite the default parameters of your devices
@ -184,6 +205,11 @@
definition: >-
Device trackers are used to track the presence, or location, of a device.
link: /integrations/device_tracker
- term: Diagnostics
definition: >-
The diagnostics integration provides a way to download diagnostic data from a device or integration for sharing in issue reports. Sharing diagnostics data when reporting an issue allows developers to diagnose and
fix your reported problem quicker.
link: /integrations/diagnostics
- term: Discovery
definition: >
Discovery is the automatic setup of zeroconf/mDNS and uPnP devices after
@ -340,6 +366,12 @@
link: https://en.wikipedia.org/wiki/Host_(network)
aliases:
- hosts
- term: Image
definition: >-
The Image integration allows other integrations to display a static image.
link: /integrations/image
aliases:
- images
- term: Integration
definition: >-
Integrations connect and integrate Home Assistant with devices, services,
@ -397,6 +429,8 @@
A light has a brightness you can control, and optionally color temperature
or RGB color control.
link: /integrations/light
aliases:
- lights
- term: Matter
definition: >-
Matter is an open-source standard that defines how to control smart home
@ -436,6 +470,12 @@
link: /docs/configuration/platform_options/
aliases:
- platforms
- term: Polling
definition: >-
Data polling is the process of querying a device or service at regular intervals to check for updates or retrieve data. By defining a custom polling interval, you can control how frequently your system checks for new data, which can help optimize performance and reduce unnecessary network traffic.
link: /common-tasks/general/#defining-a-custom-polling-interval
aliases:
- data polling
- term: Reload
definition: >-
Applies the changes made to the Home Assistant configuration files. Changes
@ -492,7 +532,6 @@
entities for organic, paper, and packaging waste. In terms of functionality,
the information service is like a device. It is called *service* to avoid
confusion, as it does not come with a piece of hardware.
link: /docs/scripts/perform-actions/
aliases:
- services
- term: State
@ -519,6 +558,8 @@
Switches are things that have two states you can select between, such as
turning on or off a socket.
link: /integrations/switch/
aliases:
- switches
- term: Template
definition: >-
A template is an automation definition that can include variables for the
@ -570,6 +611,18 @@
TTS (text-to-speech) allows Home Assistant to talk to you.
link: /integrations/tts/
- term: Update
definition: >-
An update entity is an entity that indicates if an update is available for a
device or service. This can be any update, be it a firmware update
for a device like a light bulb or router, or a software update for an add-on or a container.
excerpt: >
An update entity is an entity that indicates if an update is available for a
device or service.
link: /integrations/update
aliases:
- updates
- term: Valve
definition: >-
Valves are devices to control the flow of liquids and gases. All valves in
@ -582,9 +635,13 @@
Variables are used to store values in memory that can be processed for
example, in a script.
link: /docs/scripts/#variables
- term: YAML
definition: >-
YAML is a human-readable data serialization language. It is used to store and transmit data in a structured format. In Home Assistant, YAML is used for configuration, for example in the `configuration.yaml` or `automations.yaml` files.
link: /docs/configuration/yaml/
- term: Zone
definition: >-
Zones are areas that can be used for presence detection.
Zones allow you to specify certain regions on a map. They enable zone presence-detection and 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.
link: /integrations/zone/
aliases:
- zones

View File

@ -20,7 +20,7 @@ Madelena Mak:
Guy Sie:
name: Guy Sie
github: GuySie
github: guysie
Gordon Cameron:
name: Gordon Cameron
@ -77,3 +77,23 @@ Zac West:
Klaas Schoute:
name: Klaas Schoute
github: klaasnicolaas
Joakim Sørensen:
name: Joakim Sørensen
github: ludeeus
Andy Gill:
name: Andy Gill
github: ncandyg
Missy Quarry:
name: Missy Quarry
github: missyquarry
Annika Schulz:
name: Annika Schulz
github: anakinsbrna
Miranda Bishop:
name: Miranda Bishop
github: miranda-gb

488
source/_data/products.yml Normal file
View File

@ -0,0 +1,488 @@
green:
name: "<strong>Home Assistant Green</strong>"
distributors:
# America
- name: Amazon US
ship_from: US
ship_to: America
url: https://www.amazon.com/dp/B0CXVKSG19?maas=maas_adg_BB51722E249D328CABB2F6DF1F8976CC_afap_abs&ref_=aa_maas&tag=maas
logo: /images/distributors/amazon.webp
- name: ameriDroid
ship_from: US
ship_to: America
url: https://ameridroid.com/products/home-assistant-green
logo: /images/distributors/ameridroid.webp
- name: CloudFree
ship_from: US
ship_to: America
url: https://cloudfree.shop/product/home-assistant-green/
logo: /images/distributors/cloudfree.webp
- name: Seeed Studio
ship_from: US
ship_to: America
url: https://www.seeedstudio.com/Home-Assistant-Green-p-5792.html
logo: /images/distributors/seeed-studio.webp
# Asia
- name: Seeed Studio
ship_from: China
ship_to: Asia
url: https://www.seeedstudio.com/Home-Assistant-Green-p-5792.html
logo: /images/distributors/seeed-studio.webp
# Australia
- name: Oz Smart Things
ship_from: Australia
ship_to: Australia
url: https://www.ozsmartthings.com.au/products/home-assistant-green-smart-hub
logo: /images/distributors/oz-smart-things.webp
- name: Smart Guys
ship_from: Australia
ship_to: Australia
url: https://smartguys.com.au/home-assistant-green.html
logo: /images/distributors/smart-guys.webp
- name: SmartHome
ship_from: Australia
ship_to: Australia
url: https://www.smarthome.com.au/product/home-assistant-green/
logo: /images/distributors/smarthome.webp
# Europe
- name: Alza.cz
ship_from: Czech Republic
ship_to: Europe
url: https://www.alza.cz/home-assistant-green-d7998187.htm
logo: /images/distributors/alza-cz.webp
- name: Botland
ship_from: Poland
ship_to: Europe
url: https://botland.com.pl/centralki-i-bramki-sieciowe/24319-home-assistant-green-inteligentna-centralka-nabu-casa-nc-green-1175-794677011758.html
logo: /images/distributors/botland.webp
- name: DinamoTech
ship_from: Italy
ship_to: Europe
url: https://dinamotech.it/products/home-assistant-green
logo: /images/distributors/dinamo-tech.webp
- name: Domadoo
ship_from: France
ship_to: Europe
url: https://www.domadoo.fr/fr/box-domotique/7046-nabu-casa-box-domotique-home-assistant-green-0794677011758.html
logo: /images/distributors/domadoo.jpg
- name: Everything Smart Technology
ship_from: UK
ship_to: Europe
url: https://shop.everythingsmart.io/products/home-assistant-green
logo: /images/distributors/est.webp
- name: eWeLink device store
ship_from: Hungary
ship_to: Europe
url: https://ewelinkstore.com/product/home-assistant-green-hub/
logo: /images/distributors/ewelink.png
- name: HAshop
ship_from: Netherlands
ship_to: Europe
url: https://www.hashop.nl/Home-Assistant-Green
logo: /images/distributors/ha-shop.webp
- name: ROBBshop
ship_from: Netherlands
ship_to: Europe
url: https://www.robbshop.nl/home-assistant-green-smart-hub
logo: /images/distributors/robb.webp
- name: Kjell
ship_from: Norway
ship_to: Europe
url: https://www.kjell.com/no/produkter/smarte-hjem/kontroller/nabu-casa-home-assistant-green-p88430
logo: /images/distributors/kjell-company.webp
- name: Mauser
ship_from: Portugal
ship_to: Europe
url: https://mauser.pt/catalog/product_info.php?products_id=095-3152
logo: /images/distributors/mauser.png
- name: mediarath
ship_from: Germany
ship_to: Europe
url: https://mediarath.de/products/home-assistant-green-smart-home-hub-2x-usb-gigabit-lan-hmdi-microsd-slot
logo: /images/distributors/mediarath.de.webp
- name: m.nu
ship_from: Sweden
ship_to: Europe
url: https://en.m.nu/controllers-smart-hubs/home-assistant-green
logo: /images/distributors/m-nu.webp
- name: OkosOtthon Bolt
ship_from: Hungary
ship_to: Europe
url: https://okosotthon.bolt.hu/webaruhaz/termek/home-assistant-green-hub/
logo: /images/distributors/okosotthon.png
- name: Pi-Shop.ch
ship_from: Switzerland
ship_to: Europe
url: https://www.pi-shop.ch/home-assistant-green
logo: /images/distributors/pi-shop.webp
- name: Pimoroni
ship_from: UK
ship_to: Europe
url: https://shop.pimoroni.com/products/home-assistant-green
logo: /images/distributors/pimoroni.webp
- name: RaspberryPi.dk
ship_from: Denmark
ship_to: Europe
url: https://raspberrypi.dk/en/product/home-assistant-green/
logo: /images/distributors/RaspberryPi-dk.webp
- name: Seeed Studio
ship_from: Germany
ship_to: Europe
url: https://www.seeedstudio.com/Home-Assistant-Green-p-5792.html
logo: /images/distributors/seeed-studio.webp
- name: SmarterHOME
ship_from: Slovakia
ship_to: Europe
url: https://smarterhome.sk/sk/centralne-jednotky/home-assistant-green-smart-home-hub-1490.html
logo: /images/distributors/smarter-home.png
- name: Swiss-Domotique
ship_from: Switzerland
ship_to: Europe
url: https://shop.swiss-domotique.ch/smarthome-hub/2295-nabu-casa-home-assistant-green.html
logo: /images/distributors/swiss-domotique.webp
- name: The Pi Hut
ship_from: UK
ship_to: Europe
url: https://thepihut.com/products/home-assistant-green
logo: /images/distributors/pi-hut.webp
- name: Webhallen
ship_from: Sweden
ship_to: Europe
url: https://www.webhallen.com/se/product/364271-Nabu-Casa-Home-Assistant-Green
logo: /images/distributors/webhallen.webp
- name: WIFIShop
ship_from: Romania
ship_to: Europe
url: https://www.wifishop.ro/en/homeassistant/home-assistant-green.html
logo: /images/distributors/wifishop.webp
- name: Inet.se
ship_from: Sweden
ship_to: Europe
url: https://www.inet.se/produkt/8310063/home-assistant-green
logo: /images/distributors/inet.webp
yellow:
name: "<strong>Home Assistant Yellow</strong>"
distributors:
# America
- name: ameriDroid
ship_from: US
ship_to: America
url: https://ameridroid.com/products/home-assistant-yellow
logo: /images/distributors/ameridroid.webp
- name: CloudFree
ship_from: US
ship_to: America
url: https://cloudfree.shop/product/home-assistant-yellow/
logo: /images/distributors/cloudfree.webp
- name: Seeed Studio
ship_from: US
ship_to: America
url: https://www.seeedstudio.com/Home-Assistant-Yellow-Kit-with-selectable-CM4.html
logo: /images/distributors/seeed-studio.webp
# Asia
- name: Seeed Studio
ship_from: China
ship_to: Asia
url: https://www.seeedstudio.com/Home-Assistant-Yellow-Kit-with-selectable-CM4.html
logo: /images/distributors/seeed-studio.webp
# Australia
- name: Smart Guys
ship_from: Australia
ship_to: Australia
url: https://smartguys.com.au/product/home-assistant-yellow-smart-hub/
logo: /images/distributors/smart-guys.webp
# Europe
- name: Botland
ship_from: Poland
ship_to: Europe
url: https://botland.com.pl/centralki-i-bramki-sieciowe/24698-home-assistant-yellow-standard-kit-inteligenta-centralka-zigbee-thread-nabu-casa-yellow-kit-std-794677011741.html
logo: /images/distributors/botland.webp
- name: Mauser
ship_from: Portugal
ship_to: Europe
url: https://mauser.pt/catalog/product_info.php?products_id=095-3150
logo: /images/distributors/mauser.png
- name: Pi-Shop.ch
ship_from: Switzerland
ship_to: Europe
url: https://www.pi-shop.ch/home-assistant-yellow-kit-with-power-supply-cm4-not-included
logo: /images/distributors/pi-shop.webp
- name: RaspberryPi.dk
ship_from: Denmark
ship_to: Europe
url: https://raspberrypi.dk/en/product/home-assistant-yellow/
logo: /images/distributors/RaspberryPi-dk.webp
- name: Seeed Studio
ship_from: Germany
ship_to: Europe
url: https://www.seeedstudio.com/Home-Assistant-Yellow-Kit-with-selectable-CM4.html
logo: /images/distributors/seeed-studio.webp
- name: The Pi Hut
ship_from: UK
ship_to: Europe
url: https://thepihut.com/products/home-assistant-yellow
logo: /images/distributors/pi-hut.webp
- name: Domadoo
ship_from: France
ship_to: Europe
url: https://www.domadoo.fr/en/smart-home-hub/7113-nabu-casa-home-assistant-yellow-kit-with-power-supply.html
logo: /images/distributors/domadoo.jpg
zbt-1:
name: "<strong>Home Assistant Connect ZBT-1</strong>"
distributors:
# America
- name: ameriDroid
ship_from: US
ship_to: America
url: https://ameridroid.com/products/skyconnect
logo: /images/distributors/ameridroid.webp
- name: CloudFree
ship_from: US
ship_to: America
url: https://cloudfree.shop/product/home-assistant-skyconnect/
logo: /images/distributors/cloudfree.webp
- name: Seeed Studio
ship_from: US
ship_to: America
url: https://www.seeedstudio.com/Home-Assistant-SkyConnect-p-5479.html
logo: /images/distributors/seeed-studio.webp
# Asia
- name: Seeed Studio
ship_from: China
ship_to: Asia
url: https://www.seeedstudio.com/Home-Assistant-SkyConnect-p-5479.html
logo: /images/distributors/seeed-studio.webp
# Australia
- name: Smart Guys
ship_from: Australia
ship_to: Australia
url: https://smartguys.com.au/home-assistant-skyconnect.html
logo: /images/distributors/smart-guys.webp
# Europe
- name: Alza.cz
ship_from: Czech Republic
ship_to: Europe
url: https://www.alza.cz/home-assistant-skyconnect-usb-hub-d7815713.htm
logo: /images/distributors/alza-cz.webp
- name: Botland
ship_from: Poland
ship_to: Europe
url: https://botland.com.pl/centralki-i-bramki-sieciowe/22759-home-assistant-skyconnect-usb-stick-zgodny-z-zigbeematterthread-794677011635.html
logo: /images/distributors/botland.webp
- name: DinamoTech
ship_from: Italy
ship_to: Europe
url: https://dinamotech.it/products/home-assistant-connect-zbt-1
logo: /images/distributors/dinamo-tech.webp
- name: Domadoo
ship_from: France
ship_to: Europe
url: https://www.domadoo.fr/fr/box-domotique/6938-dongle-usb-zigbee-30-sky-connect-pour-home-assistant-nabu-casa-0794677011635.html
logo: /images/distributors/domadoo.jpg
- name: Everything Smart Technology
ship_from: UK
ship_to: Europe
url: https://shop.everythingsmart.io/products/home-assistant-skyconnect
logo: /images/distributors/est.webp
- name: eWeLink device store
ship_from: Hungary
ship_to: Europe
url: https://ewelinkstore.com/product/home-assistant-connect-zbt-1-a-zigbee-thread-matter-usb-stick/
logo: /images/distributors/ewelink.png
- name: HAshop
ship_from: Netherlands
ship_to: Europe
url: https://www.hashop.nl/Home-Assistant-SkyConnect
logo: /images/distributors/ha-shop.webp
- name: Kjell
ship_from: Norway
ship_to: Europe
url: https://www.kjell.com/no/produkter/smarte-hjem/kontroller/nabu-casa-home-assistant-skyconnect-p88431
logo: /images/distributors/kjell-company.webp
- name: Mauser
ship_from: Portugal
ship_to: Europe
url: https://mauser.pt/catalog/product_info.php?products_id=095-1222
logo: /images/distributors/mauser.png
- name: mediarath
ship_from: Germany
ship_to: Europe
url: https://mediarath.de/products/home-assistant-connect-zbt-1-zigbee-thread-matter-usb-stick-fur-home-assistant-skyconnect
logo: /images/distributors/mediarath.de.webp
- name: m.nu
ship_from: Sweden
ship_to: Europe
url: https://en.m.nu/zigbee/controllers-zigbee/home-assistant-skyconnect-zigbee-matter-thread
logo: /images/distributors/m-nu.webp
- name: OkosOtthon Bolt
ship_from: Hungary
ship_to: Europe
url: https://okosotthon.bolt.hu/webaruhaz/termek/home-assistant-connect-zbt-1-zigbee-thread-matter-usb-kulcs/
logo: /images/distributors/okosotthon.png
- name: Pimoroni
ship_from: UK
ship_to: Europe
url: https://shop.pimoroni.com/products/home-assistant-connect-zbt-1
logo: /images/distributors/pimoroni.webp
- name: RaspberryPi.dk
ship_from: Denmark
ship_to: Europe
url: https://raspberrypi.dk/en/product/home-assistant-skyconnect/
logo: /images/distributors/RaspberryPi-dk.webp
- name: Robbshop
ship_from: Netherlands
ship_to: Europe
url: https://www.robbshop.nl/home-assistant-skyconnect-zigbee-en-thread-usb
logo: /images/distributors/robb.webp
- name: Seeed Studio
ship_from: Germany
ship_to: Europe
url: https://www.seeedstudio.com/Home-Assistant-SkyConnect-p-5479.html
logo: /images/distributors/seeed-studio.webp
- name: SmarterHOME
ship_from: Slovakia
ship_to: Europe
url: https://smarterhome.sk/sk/zwave-pc-adaptery/home-assistant-connect-zbt-1-zigbee-a-thread-usb-adapter-1646.html
logo: /images/distributors/smarter-home.png
- name: Swiss-Domotique
ship_from: Switzerland
ship_to: Europe
url: https://shop.swiss-domotique.ch/de/smarthome-zentrale/2118-nabu-casa-home-assistant-skyconnect.html
logo: /images/distributors/swiss-domotique.webp
- name: The Pi Hut
ship_from: UK
ship_to: Europe
url: https://thepihut.com/collections/latest-raspberry-pi-products/products/home-assistant-skyconnect
logo: /images/distributors/pi-hut.webp
- name: Webhallen
ship_from: Sweden
ship_to: Europe
url: https://www.webhallen.com/se/product/357205-Home-Assistant-SkyConnect-ZigbeeMatterThread
logo: /images/distributors/webhallen.webp
- name: WIFIShop
ship_from: Romania
ship_to: Europe
url: https://www.wifishop.ro/en/homeassistant/home-assistant-skyconnect.html
logo: /images/distributors/wifishop.webp
- name: Inet.se
ship_from: Sweden
ship_to: Europe
url: https://www.inet.se/produkt/8310064/home-assistant-connect-zbt-1
logo: /images/distributors/inet.webp
voice-pe:
name: "<strong>Home Assistant Voice</strong> Preview Edition"
distributors:
# America
- name: ameriDroid
ship_from: US
ship_to: America
url: https://ameridroid.com/products/home-assistant-voice-preview-edition/
logo: /images/distributors/ameridroid.webp
- name: CloudFree
ship_from: US
ship_to: America
url: https://cloudfree.shop/product/home-assistant-voice-preview-edition/
logo: /images/distributors/cloudfree.webp
- name: Seeed Studio
ship_from: US
ship_to: America
url: https://www.seeedstudio.com/Home-Assistant-Voice-p-6998.html
logo: /images/distributors/seeed-studio.webp
# Asia
- name: Seeed Studio
ship_from: China
ship_to: Asia
url: https://www.seeedstudio.com/Home-Assistant-Voice-p-6998.html
logo: /images/distributors/seeed-studio.webp
# Australia
- name: OZ Smart Things
ship_from: Australia
ship_to: Australia
url: https://www.ozsmartthings.com.au/products/ha-voice-preview-edition
logo: /images/distributors/oz-smart-things.webp
- name: Smart Guys
ship_from: Australia
ship_to: Australia
url: https://smartguys.com.au/product/home-assistant-voice-preview-edition/
logo: /images/distributors/smart-guys.webp
# Europe
- name: Alza.cz
ship_from: Czech Republic
ship_to: Europe
url: https://www.alza.cz/home-assistant-voice-preview-edition-d12741248.htm
logo: /images/distributors/alza-cz.webp
- name: RaspberryPi.dk
ship_from: Denmark
ship_to: Europe
url: https://raspberrypi.dk/en/product/home-assistant-voice-preview-edition/
logo: /images/distributors/RaspberryPi-dk.webp
- name: Domadoo
ship_from: France
ship_to: Europe
url: https://www.domadoo.fr/fr/box-domotique/7558-nabu-casa-home-assistant-voice-preview-edition-0860011789727.html
logo: /images/distributors/domadoo.jpg
- name: mediarath
ship_from: Germany
ship_to: Europe
url: https://mediarath.de/products/home-assistant-voice-preview-edition-open-source-privacy-focused-voice-assistant-with-esphome
logo: /images/distributors/mediarath.de.webp
- name: Seeed Studio
ship_from: Germany
ship_to: Europe
url: https://www.seeedstudio.com/Home-Assistant-Voice-p-6998.html
logo: /images/distributors/seeed-studio.webp
- name: Dinamotech
ship_from: Italy
ship_to: Europe
url: https://dinamotech.it/products/home-assistant-voice
logo: /images/distributors/dinamo-tech.webp
- name: Botland
ship_from: Poland
ship_to: Europe
url: https://botland.com.pl/asystenci-glosowi/25872-home-assistant-voice-preview-edition-asystent-glosowy-860011789727.html
logo: /images/distributors/botland.webp
- name: Mauser.pt
ship_from: Portugal
ship_to: Europe
url: https://mauser.pt/catalog/product_info.php?products_id=095-4747
logo: /images/distributors/mauser.png
- name: SmarterHOME
ship_from: Slovakia
ship_to: Europe
url: https://smarterhome.sk/sk/hlasovi-asistenti/home-assistant-voice-preview-edition-1714.html
logo: /images/distributors/smarter-home.png
- name: Webhallen
ship_from: Sweden
ship_to: Europe
url: https://www.webhallen.com/377166
logo: /images/distributors/webhallen.webp
- name: Swiss-Domotique
ship_from: Switzerland
ship_to: Europe
url: https://shop.swiss-domotique.ch/de/sound/2667-nabu-casa-home-assistant-voice-preview-edition.html
logo: /images/distributors/swiss-domotique.webp
- name: The Pi Hut
ship_from: UK
ship_to: Europe
url: https://thepihut.com/products/home-assistant-voice-preview-edition
logo: /images/distributors/pi-hut.webp
- name: Everything Smart Technology
ship_from: UK
ship_to: Europe
url: https://shop.everythingsmart.io/products/home-assistant-voice-preview-edition
logo: /images/distributors/est.webp
- name: Pimoroni
ship_from: UK
ship_to: Europe
url: https://shop.pimoroni.com/products/home-assistant-voice
logo: /images/distributors/pimoroni.webp
- name: Inet.se
ship_from: Sweden
ship_to: Europe
url: https://www.inet.se/produkt/8310094/home-assistant-voice-preview-edition
logo: /images/distributors/inet.webp
- name: Pi-Shop.ch
ship_from: Switzerland
ship_to: Europe
url: https://www.pi-shop.ch/home-assistant-voice-preview-edition
logo: /images/distributors/pi-shop.webp

View File

@ -7,7 +7,7 @@ The authentication system secures access to Home Assistant.
## Login screen
You are greeted with a log in screen, asking you for user name and password.
You are greeted with a log in screen, asking you for username and password.
<img src='/images/docs/authentication/login-outside-local-network.png' alt='Screenshot of the login screen, when logging in from within the local network' style='border: 0;box-shadow: none;'>
@ -55,9 +55,9 @@ As an extra level of security, you can turn on [multi-factor authentication](/do
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
## Changing display or username
To learn how to change a display or user name, refer to [setting up basic information](/docs/configuration/basic/).
To learn how to change a display or username, refer to [setting up basic information](/docs/configuration/basic/).
## Other authentication techniques

View File

@ -123,11 +123,16 @@ homeassistant:
- group: system-users
```
First note, for `trusted_users` configuration you need to use `user id`, which you can find through {% my users title="Settings -> People" %} -> View User Detail. The `trusted_users` configuration will not validate the existence of the user, so please make sure you have put in the correct user id by yourself.
First note, for `trusted_users` configuration you need to use `user id`.
Second note, a trusted user with an IPv6 address must put the IPv6 address in quotes as shown.
1. To find the user ID, in your browser, make sure the URL of your Home Assistant ends in `config/users/`.
- For example: `homeassistant:8123/config/users`.
2. Select the user from the list, and copy the ID.
- For example: `acbbff56461748718f3650fb914b88c9`.
3. The `trusted_users` configuration will not validate the existence of the user, so please make sure you have put in the correct user id.
4. A trusted user with an IPv6 address must put the IPv6 address in quotes as shown.
In above example, if user try to access Home Assistant from 192.168.0.1, they will have only one user available to choose. They will have two users available if access from 192.168.0.38 (from 192.168.0.0/24 network). If they access from 192.168.10.0/24 network, they can choose from all available users (non-system and active users).
In the above example, if user try to access Home Assistant from 192.168.0.1, they will have only one user available to choose. They will have two users available if access from 192.168.0.38 (from 192.168.0.0/24 network). If they access from 192.168.10.0/24 network, they can choose from all available users (non-system and active users).
Specially, you can use `group: GROUP_ID` to assign all users in certain `user group` to be available to choose. Group and users can be mix and match.

View File

@ -3,7 +3,7 @@ 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 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. The automation will be executed if all conditions return true, otherwise, if any of them does not return true, the automation will stop executing.
Conditions look very similar to triggers, but they are very different &mdash; 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.

View File

@ -25,6 +25,7 @@ Triggers from all platforms will include the following data.
| Template variable | Data |
| ---- | ---- |
| `trigger.alias` | Alias of the trigger.
| `trigger.id` | The [`id` of the trigger](/docs/automation/trigger/#trigger-id).
| `trigger.idx` | Index of the trigger. (The first trigger idx is `0`.)
@ -102,6 +103,7 @@ These are the properties available for a [Sentence trigger](/docs/automation/tri
| `trigger.sentence` | Text of the sentence that was matched
| `trigger.slots` | Object with matched slot values
| `trigger.details` | Object with matched slot details by name, such as [wildcards](/docs/automation/trigger/#sentence-wildcards). Each detail contains: <ul><li>`name` - name of the slot</li><li>`text` - matched text</li><li>`value` - output value (see [lists](https://developers.home-assistant.io/docs/voice/intent-recognition/template-sentence-syntax/#lists))</li></ul>
| `trigger.device_id` | The device ID that captured the command, if any.
### State

View File

@ -241,6 +241,11 @@ automation:
{% endraw %}
{% 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.
{% endnote %}
When the `attribute` option is specified the trigger is compared to the given `attribute` instead of the state of the entity.
{% raw %}
@ -288,11 +293,6 @@ automation:
{% endraw %}
{% 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.
{% 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.
However, the comparison will only be made when the entity specified in the trigger is updated. This would look like:
@ -769,7 +769,7 @@ automation:
entity_id: sensor.phone_next_alarm
offset: -00:05:00
actions:
- service: light.turn_on
- action: light.turn_on
target:
entity_id: light.bedroom
```
@ -793,6 +793,38 @@ automation:
offset: "-00:10:00"
```
### Limited templates
It's also possible to use [limited templates](/docs/configuration/templating/#limited-templates) for times.
{% raw %}
```yaml
blueprint:
input:
alarm:
name: Alarm
selector:
text:
hour:
name: Hour
selector:
number:
min: 0
max: 24
trigger_variables:
my_alarm: !input alarm
my_hour: !input hour
trigger:
- platform: time
at:
- "sensor.{{ my_alarm | slugify }}_time"
- "{{ my_hour }}:30:00"
```
{% endraw %}
## Time pattern trigger
With the time pattern trigger, you can match if the hour, minute or second of the current time matches a specific value. You can prefix the value with a `/` to match whenever the value is divisible by that number. You can specify `*` to match any value (when using the web interface this is required, the fields cannot be left empty).
@ -1080,7 +1112,7 @@ blueprint:
## Merging lists of triggers
{% caution %}
This feature requires Home Assistant version 2024.10 or later. If using this in a blueprint, set the `min_version` for the blueprint to at least this version.
This feature requires Home Assistant version 2024.10 or later. If using this in a blueprint, set the `min_version` for the blueprint to at least this version. See the [blueprint schema documentation](/docs/blueprint/schema/#min_version) for more details.
{% endcaution %}
In some advanced cases (like for blueprints with trigger selectors), it may be necessary to insert a second list of triggers into the main trigger list. This can be done by adding a dictionary in the main trigger list with the sole key `triggers`, and the value for that key contains a second list of triggers. These will then be flattened into a single list of triggers. For example:

View File

@ -83,7 +83,7 @@ Blueprints created by the community may go through multiple revisions. Sometimes
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:
its {% term YAML %} content to keep it up to date:
1. Navigate to the blueprints directory (`blueprints/automation/`).
The location of this directory depends on the installation method. It's
@ -91,7 +91,7 @@ its YAML content to keep it up to date:
2. Next, you must find the blueprint to update. The path name of a blueprint consists of:
- The username of the user that created it. The name depends on the source of the blueprint:
the forum, or GitHub.
- The name of the YAML file. For the forum it's the title of the topic in the URL, for GitHub
- The name of the {% term YAML %} file. For the forum it's the title of the topic in the URL, for GitHub
it's the name of the YAML file.
3. Open the YAML file with your editor and update its contents.
4. Reload the automations for the changes to take effect.

View File

@ -3,11 +3,11 @@ title: "Automation YAML"
description: "How to use the automation integration with YAML."
---
Automations are created in Home Assistant via the UI, but are stored in a YAML format. If you want to edit the YAML of an {% term automation %}, select the automation, click on the menu button in the top right then on **Edit in YAML**.
Automations are created in Home Assistant via the UI, but are stored in a {% term YAML %} format. If you want to edit the {% term YAML %} of an {% term automation %}, select the automation, click on the menu button in the top right then on **Edit in YAML**.
The UI will write your automations to `automations.yaml`. This file is managed by the UI and should not be edited manually.
It is also possible to write your automations directly inside {% term "`configuration.yaml`" %} or other YAML files. You can do this by adding a labeled `automation` block to your `configuration.yaml`:
It is also possible to write your automations directly inside {% term "`configuration.yaml`" %} or other {% term YAML %} files. You can do this by adding a labeled `automation` block to your `configuration.yaml`:
```yaml
# The configuration required for the UI to work
@ -125,10 +125,9 @@ actions:
<img src='/images/integrations/script/script_modes.jpg'>
</p>
## YAML example
Example of a YAML based automation that you can add to {% term "`configuration.yaml`" %}.
Example of a {% term YAML %} based automation that you can add to {% term "`configuration.yaml`" %}.
{% raw %}
@ -157,7 +156,7 @@ automation my_lights:
after: "16:00:00"
before: "23:00:00"
actions:
# With a single service entry, we don't need a '-' before service - though you can if you want to
# With a single action entry, we don't need a '-' before action - though you can if you want to
- action: homeassistant.turn_on
target:
entity_id: group.living_room
@ -207,7 +206,7 @@ automation my_lights:
## Extra options
When writing automations directly in YAML, you will have access to advanced options that are not available in the user interface.
When writing automations directly in {% term YAML %}, you will have access to advanced options that are not available in the user interface.
### Automation initial state
@ -223,7 +222,7 @@ automation:
### Number of debug traces stored
When using YAML you can configure the number of debugging traces stored for an automation. This is controlled with the `stored_traces` option under `trace`. Set `stored_traces` to the number of traces you wish to store for the particular automation. If not specified the default value of 5 will be used.
When using {% term YAML %} you can configure the number of debugging traces stored for an automation. This is controlled with the `stored_traces` option under `trace`. Set `stored_traces` to the number of traces you wish to store for the particular automation. If not specified the default value of 5 will be used.
```yaml
automation:
@ -263,7 +262,7 @@ If you want to migrate your manual automations to use the editor, you'll have to
### Deleting automations
When automations remain visible in the Home Assistant dashboard, even after having deleted in the YAML file, you have to delete them in the UI.
When automations remain visible in the Home Assistant dashboard, even after having deleted in the {% term YAML %} file, you have to delete them in the UI.
To delete them completely, go to UI {% my entities title="**Settings** > **Devices & services** > **Entities**" %} and find the automation in the search field or by scrolling down.

View File

@ -41,61 +41,198 @@ Get all available tables from your current Home Assistant database:
sqlite> SELECT sql FROM sqlite_master;
-------------------------------------------------------------------------------------
CREATE TABLE events (
event_id INTEGER NOT NULL,
event_type VARCHAR(32),
event_data TEXT,
origin VARCHAR(32),
time_fired DATETIME,
created DATETIME,
context_id VARCHAR(36),
context_user_id VARCHAR(36), context_parent_id CHARACTER(36),
PRIMARY KEY (event_id)
CREATE TABLE event_data (
data_id INTEGER NOT NULL,
hash BIGINT,
shared_data TEXT,
PRIMARY KEY (data_id)
)
CREATE TABLE event_types (
event_type_id INTEGER NOT NULL,
event_type VARCHAR(64),
PRIMARY KEY (event_type_id)
)
CREATE TABLE state_attributes (
attributes_id INTEGER NOT NULL,
hash BIGINT,
shared_attrs TEXT,
PRIMARY KEY (attributes_id)
)
CREATE TABLE states_meta (
metadata_id INTEGER NOT NULL,
entity_id VARCHAR(255),
PRIMARY KEY (metadata_id)
)
CREATE TABLE statistics_meta (
id INTEGER NOT NULL,
statistic_id VARCHAR(255),
source VARCHAR(32),
unit_of_measurement VARCHAR(255),
has_mean BOOLEAN,
has_sum BOOLEAN,
name VARCHAR(255),
PRIMARY KEY (id)
)
CREATE TABLE recorder_runs (
run_id INTEGER NOT NULL,
start DATETIME,
"end" DATETIME,
closed_incorrect BOOLEAN,
created DATETIME,
PRIMARY KEY (run_id),
CHECK (closed_incorrect IN (0, 1))
run_id INTEGER NOT NULL,
start DATETIME NOT NULL,
"end" DATETIME,
closed_incorrect BOOLEAN NOT NULL,
created DATETIME NOT NULL,
PRIMARY KEY (run_id)
)
CREATE TABLE migration_changes (
migration_id VARCHAR(255) NOT NULL,
version SMALLINT NOT NULL,
PRIMARY KEY (migration_id)
)
CREATE TABLE schema_changes (
change_id INTEGER NOT NULL,
schema_version INTEGER,
changed DATETIME,
PRIMARY KEY (change_id)
change_id INTEGER NOT NULL,
schema_version INTEGER,
changed DATETIME NOT NULL,
PRIMARY KEY (change_id)
)
CREATE TABLE statistics_runs (
run_id INTEGER NOT NULL,
start DATETIME NOT NULL,
PRIMARY KEY (run_id)
)
CREATE TABLE events (
event_id INTEGER NOT NULL,
event_type CHAR(0),
event_data CHAR(0),
origin CHAR(0),
origin_idx SMALLINT,
time_fired CHAR(0),
time_fired_ts FLOAT,
context_id CHAR(0),
context_user_id CHAR(0),
context_parent_id CHAR(0),
data_id INTEGER,
context_id_bin BLOB,
context_user_id_bin BLOB,
context_parent_id_bin BLOB,
event_type_id INTEGER,
PRIMARY KEY (event_id),
FOREIGN KEY(data_id) REFERENCES event_data (data_id),
FOREIGN KEY(event_type_id) REFERENCES event_types (event_type_id)
)
CREATE TABLE states (
state_id INTEGER NOT NULL,
domain VARCHAR(64),
entity_id VARCHAR(255),
state VARCHAR(255),
attributes TEXT,
event_id INTEGER,
last_changed DATETIME,
last_updated DATETIME,
created DATETIME,
context_id VARCHAR(36),
context_user_id VARCHAR(36), context_parent_id CHARACTER(36), old_state_id INTEGER,
PRIMARY KEY (state_id),
FOREIGN KEY(event_id) REFERENCES events (event_id)
state_id INTEGER NOT NULL,
entity_id CHAR(0),
state VARCHAR(255),
attributes CHAR(0),
event_id SMALLINT,
last_changed CHAR(0),
last_changed_ts FLOAT,
last_reported_ts FLOAT,
last_updated CHAR(0),
last_updated_ts FLOAT,
old_state_id INTEGER,
attributes_id INTEGER,
context_id CHAR(0),
context_user_id CHAR(0),
context_parent_id CHAR(0),
origin_idx SMALLINT,
context_id_bin BLOB,
context_user_id_bin BLOB,
context_parent_id_bin BLOB,
metadata_id INTEGER,
PRIMARY KEY (state_id),
FOREIGN KEY(old_state_id) REFERENCES states (state_id),
FOREIGN KEY(attributes_id) REFERENCES state_attributes (attributes_id),
FOREIGN KEY(metadata_id) REFERENCES states_meta (metadata_id)
)
CREATE TABLE statistics (
id INTEGER NOT NULL,
created CHAR(0),
created_ts FLOAT,
metadata_id INTEGER,
start CHAR(0),
start_ts FLOAT,
mean FLOAT,
min FLOAT,
max FLOAT,
last_reset CHAR(0),
last_reset_ts FLOAT,
state FLOAT,
sum FLOAT,
PRIMARY KEY (id),
FOREIGN KEY(metadata_id) REFERENCES statistics_meta (id) ON DELETE CASCADE
)
CREATE TABLE statistics_short_term (
id INTEGER NOT NULL,
created CHAR(0),
created_ts FLOAT,
metadata_id INTEGER,
start CHAR(0),
start_ts FLOAT,
mean FLOAT,
min FLOAT,
max FLOAT,
last_reset CHAR(0),
last_reset_ts FLOAT,
state FLOAT,
sum FLOAT,
PRIMARY KEY (id),
FOREIGN KEY(metadata_id) REFERENCES statistics_meta (id) ON DELETE CASCADE
)
CREATE TABLE sqlite_stat1(tbl,idx,stat)
CREATE INDEX ix_events_context_user_id ON events (context_user_id)
CREATE INDEX ix_events_event_type ON events (event_type)
CREATE INDEX ix_events_context_id ON events (context_id)
CREATE INDEX ix_events_time_fired ON events (time_fired)
CREATE INDEX ix_event_data_hash ON event_data (hash)
CREATE UNIQUE INDEX ix_event_types_event_type ON event_types (event_type)
CREATE INDEX ix_state_attributes_hash ON state_attributes (hash)
CREATE UNIQUE INDEX ix_states_meta_entity_id ON states_meta (entity_id)
CREATE UNIQUE INDEX ix_statistics_meta_statistic_id ON statistics_meta (statistic_id)
CREATE INDEX ix_recorder_runs_start_end ON recorder_runs (start, "end")
CREATE INDEX ix_states_entity_id ON states (entity_id)
CREATE INDEX ix_states_context_user_id ON states (context_user_id)
CREATE INDEX ix_states_last_updated ON states (last_updated)
CREATE INDEX ix_states_event_id ON states (event_id)
CREATE INDEX ix_states_entity_id_last_updated ON states (entity_id, last_updated)
CREATE INDEX ix_states_context_id ON states (context_id)
CREATE INDEX ix_states_context_parent_id ON states (context_parent_id)
CREATE INDEX ix_events_context_parent_id ON events (context_parent_id)
CREATE INDEX ix_statistics_runs_start ON statistics_runs (start)
CREATE INDEX ix_events_data_id ON events (data_id)
CREATE INDEX ix_events_event_type_id_time_fired_ts ON events (event_type_id, time_fired_ts)
CREATE INDEX ix_events_context_id_bin ON events (context_id_bin)
CREATE INDEX ix_events_time_fired_ts ON events (time_fired_ts)
CREATE INDEX ix_states_attributes_id ON states (attributes_id)
CREATE INDEX ix_states_metadata_id_last_updated_ts ON states (metadata_id, last_updated_ts)
CREATE INDEX ix_states_old_state_id ON states (old_state_id)
CREATE INDEX ix_states_context_id_bin ON states (context_id_bin)
CREATE INDEX ix_states_last_updated_ts ON states (last_updated_ts)
CREATE UNIQUE INDEX ix_statistics_statistic_id_start_ts ON statistics (metadata_id, start_ts)
CREATE INDEX ix_statistics_start_ts ON statistics (start_ts)
CREATE INDEX ix_statistics_short_term_start_ts ON statistics_short_term (start_ts)
CREATE UNIQUE INDEX ix_statistics_short_term_statistic_id_start_ts ON statistics_short_term (metadata_id, start_ts)
```
To only show the details about the `states` table (since we are using that one in the next examples):
@ -110,7 +247,7 @@ The identification of the available columns in the table is done and we are now
```bash
sqlite> .width 30, 10,
sqlite> SELECT entity_id, COUNT(*) as count FROM states GROUP BY entity_id ORDER BY count DESC LIMIT 10;
sqlite> SELECT states_meta.entity_id, COUNT(*) as count FROM states INNER JOIN states_meta ON states.metadata_id = states_meta.metadata_id GROUP BY states_meta.entity_id ORDER BY count DESC LIMIT 10;
entity_id count
------------------------------ ----------
sensor.cpu 28874

View File

@ -18,10 +18,12 @@ This section gives a high-level introduction to blueprints. To view a descriptio
## What is a blueprint?
A blueprint is a {% term script %} or {% term automation %} configuration with certain parts marked as configurable. This allows you to create different scripts or automations based on the same blueprint.
A blueprint is a {% term script %}, {% term automation %} or [template entity](/integrations/template/) configuration with certain parts marked as configurable. This allows you to create different scripts, automations or template entities based on the same blueprint.
Imagine you want to control lights based on motion. A blueprint provides the generic {% term automation %} framework, while letting you select one specific motion sensor as a {% term trigger %}, and the exact light to control. This blueprint makes it possible to create two automations. Each automation has their own configuration and act completely independently. Yet, they share some basic automation configuration so that you do not have to set this up every time.
Automations inherit from blueprints, which means that changes made to a blueprint will be reflected in all automations based on that blueprint the next time the automations are reloaded. This occurs as part of Home Assistant starting. To manually reload the automations, go to {% my server_controls title="**Developer tools** > **YAML**" %} and reload the automations.
Blueprints are shared by the community in the [blueprint community forum][blueprint-forums].
[blueprint-forums]: /get-blueprints

View File

@ -57,7 +57,7 @@ description:
domain:
description: >
The domain in which this blueprint is used. Currently, only
[`automation`](/docs/automation/yaml/) and `script` are supported.
[`automation`](/docs/automation/yaml/), `script` and [`template`](/integrations/template/#using-blueprints) are supported.
type: string
required: true
author:
@ -157,7 +157,7 @@ by their name; not by section and name.
A section is differentiated from an input by the presence of an additional `input` key within that section.
{% caution %}
Input sections are a new feature in version 2024.6.0. 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.
Input sections are a new feature in version 2024.6.0. 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. See [this section](/docs/blueprint/schema/#min_version) for more details.
{% endcaution %}
The full configuration for a section is below:

View File

@ -150,6 +150,12 @@ device:
the set model.
type: string
required: false
model_id:
description: >
When set, the list of areas is limited to areas with devices that have
the set model ID.
type: string
required: false
entity:
description: >
When entity options are provided, the list of areas is filtered by areas
@ -485,7 +491,7 @@ devices based on the selector configuration. The value of the input will contain
the device ID or a list of device IDs, based on if `multiple` is set to `true`.
A device selector can filter the list of devices, based on things like the
manufacturer or model of the device, the entities the device provides or based
manufacturer, model, or model ID of the device, the entities the device provides or based
on the domain that provided the device.
![Screenshot of a device selector](/images/blueprints/selector-device.png)
@ -561,6 +567,11 @@ filter:
When set, it limits the list of devices to devices that have the set model.
type: string
required: false
model_id:
description: >
When set, the list of devices is limited to devices that have the set model ID.
type: string
required: false
multiple:
description: >
Allows selecting multiple devices. If set to `true`, the resulting value of
@ -792,6 +803,12 @@ device:
the set model.
type: string
required: false
model_id:
description: >
When set, the list only includes floors with devices that have
the set model ID.
type: string
required: false
entity:
description: >
When entity options are provided, the list only includes floors
@ -1342,6 +1359,10 @@ device:
description: When set, it limits the targets to devices by the set model.
type: string
required: false
model_id:
description: When set, the targets are limited to devices that have the set model ID.
type: string
required: false
entity:
description: >
When entity options are provided, the targets are limited by entities
@ -1539,3 +1560,19 @@ The output of this selector is a list of triggers. For example:
entity_id: "sensor.outside_temperature"
below: 20
```
### Example - Merging with existing triggers
If the trigger(s) should exist within a blueprint that already has some default triggers defined, and an additional customizable trigger should be merged, you need to use the `- triggers` syntax in the blueprint.
```yaml
# Example trigger selector
input:
my_trigger_input:
selector:
trigger:
triggers:
- triggers: !input my_trigger_input
- platform: numeric_state
[...]
```

View File

@ -193,7 +193,7 @@ blueprint:
entity:
filter:
- domain: binary_sensor
- device_class: motion
device_class: motion
target_light:
name: Lights
description: The lights to keep in sync.
@ -224,7 +224,7 @@ blueprint:
entity:
filter:
- domain: binary_sensor
- device_class: motion
device_class: motion
target_light:
name: Lights
description: The lights to keep in sync.

View File

@ -6,7 +6,7 @@ related:
title: YAML syntax
- docs: /docs/configuration/secrets
title: Storing credentials in `secrets.yaml` file
- docs: /common-tasks/os/#backups
- docs: /common-tasks/general/#backups
title: Creating and restoring backups
- docs: /integrations/backup/docs/tools/dev-tools/#reloading-the-yaml-configuration
title: Creating backups for Home Assistant Container and Core

View File

@ -39,7 +39,7 @@ To change the general settings that were defined during onboarding, follow these
## 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.
The display name is the name that is shown in Home Assistant. It can differ from the username, which is the name used to log in.
### Prerequisites
@ -50,18 +50,19 @@ The display name is the name that is shown in Home Assistant. It can differ from
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
## Changing a username
The user name is the name that is used to log in. It can differ from the display name.
The username 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.
- You need owner rights to change a username.
### 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.
- It must be lowercase and contain no spaces.
- The log in is case-sensitive.
## Changing authentication settings

View File

@ -3,26 +3,15 @@ title: "Entities and domains"
description: "Describes what entities and domains are in Home Assistant."
related:
- docs: /docs/configuration/state_object/
title: State object, entity state
title: State object, entity state and attributes
---
Your {% term devices %} are represented in Home Assistant as entities. Entities are the basic building blocks to hold data in Home Assistant. An entity represents a {% term sensor %}, actor, or function in Home Assistant. Entities are used to monitor physical properties or to control other entities. An entity is usually part of a {% term device %} or a {% term service %}. Entities have [states](/docs/configuration/state_object/) and [attributes](#entity-attributes).
Your devices are represented in Home Assistant as entities. Entities are the basic building blocks to hold data in Home Assistant. An entity represents a {% term sensor %}, actor, or function in Home Assistant. Entities are used to monitor physical properties or to control other entities. An entity is usually part of a {% term device %} or a {% term service %}. Entities have [states](/docs/configuration/state_object/) and [state attributes](/docs/configuration/state_object/#about-entity-state-attributes).
All your entities are listed in the entities table, under {% my entities title="**Settings** > **Devices & services** > **Entities**" %}.
<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>
## Entity attributes
Many entities have attributes. There are a few attributes that are available on all entities, such as `friendly_name` and `icon`. In addition to those, each integration has its own attributes to represent extra state data about the entity. For example, the light integration has attributes for the current brightness and color of the light. When an attribute is not available, Home Assistant will not write it to the state. The list of available attributes depends on the {% term device %}.
<p class='img'>
<img src='/images/integrations/light/state_light.png' alt='Screenshot showing three lights with different states and attributes'>
Example showing three lights with differents states and different attributes.
</p>
For more information on entity attributes, refer to the [attributes](/docs/configuration/state_object/#attributes) section on the state objects page.
## Domains
Each integration in Home Assistant has a unique identifier: a domain. All entities and actions available in Home Assistant are provided by integrations and thus belong to such a domain. The first part of the entity or action, before the `.` shows the domain they belong to. For example, `light.bed_light` is an entity in the light domain. `bed_light` is the ID of the entity.

View File

@ -3,7 +3,7 @@ title: "Packages"
description: "Describes all there is to know about configuration packages in Home Assistant."
---
Packages in Home Assistant provide a way to bundle different integration's configuration together. With packages we have a way to include different integrations, or different configuration parts using any of the `!include` directives introduced in [splitting the configuration](/docs/configuration/splitting_configuration).
Packages in Home Assistant provide a way to bundle configurations from multiple integrations. With packages, we have a way to include multiple integrations, or parts of integrations using any of the `!include` directives introduced in [splitting the configuration](/docs/configuration/splitting_configuration).
Packages are configured under the core `homeassistant/packages` in the configuration and take the format of a package name (no spaces, all lower case) followed by a dictionary with the package configuration. For example, package `pack_1` would be created as:
@ -17,7 +17,7 @@ homeassistant:
The package configuration can include: `switch`, `light`, `automation`, `groups`, or most other Home Assistant integrations including hardware platforms.
It can be specified inline or in a separate YAML file using `!include`.
It can be specified inline or in a separate {% term YAML %} file using `!include`.
Inline example, main {% term "`configuration.yaml`" %}:
@ -74,7 +74,7 @@ Integrations inside packages can only specify platform entries using configurati
## Create a packages folder
One way to organize packages is to create a folder named "packages" in your Home Assistant configuration directory. In the packages directory, you can store any number of packages in a YAML file. This entry in your {% term "`configuration.yaml`" %} will load all YAML-files in this _packages_ folder and its subfolders:
One way to organize packages is to create a folder named "packages" in your Home Assistant configuration directory. In the packages directory, you can store any number of packages in a {% term YAML %} file. This entry in your {% term "`configuration.yaml`" %} will load all {% term YAML %}-files in this _packages_ folder and its subfolders:
```yaml
homeassistant:

View File

@ -12,7 +12,7 @@ related:
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/).
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 {% term YAML %} files if you [split up your configuration](/docs/configuration/splitting_configuration/).
## Using `secrets.yaml`
@ -48,7 +48,7 @@ rest_password: "YOUR_PASSWORD"
When you start splitting your configuration into multiple files, you might end up with configuration in sub folders. Secrets will be resolved in this order:
- A `secrets.yaml` located in the same folder as the YAML file referencing the secret,
- A `secrets.yaml` located in the same folder as the {% term YAML %} file referencing the secret,
- next, parent folders will be searched for a `secrets.yaml` file with the secret, stopping at the folder with the main {% term "`configuration.yaml`" %}.
To see where secrets are being loaded from, you can either add an option to your `secrets.yaml` file or use the `check_config` script. The latter is only available for {% term "Home Assistant Core" %} installations given it's available through [`hass`](/docs/tools/hass/).

View File

@ -1,52 +1,86 @@
---
title: "State objects"
description: "Describes all there is to know about state objects in Home Assistant."
title: "State and state object"
description: "Describes all there is to know about state and the state object in Home Assistant."
related:
- docs: /docs/configuration/entities_domains/
title: Entities and domains
---
Your {% term devices %} are represented in Home Assistant as entities. The {% term entities %} will write their current {% term state %} to the state machine for other entities/templates/frontend to access. States are a current representation of the {% term entity %}.
Devices are represented in Home Assistant as {% term entities %}. The state of an entity (for example, if a light is on, at 50% brightness in orange) can be shown on the dashboard or be used in automations. This page looks at the concepts _state_, _state object_, and _entity state attribute_.
If you overwrite a state via the states dev tool or the API, it will not impact the actual device. If the device state is being polled, it will overwrite the state in the state machine the next polling.
## State versus state object
All states will always have an entity id, a state and a timestamp when last updated and last changed.
In Home Assistant, the state object is the current representation of the {% term entity %} with all its attributes at a given moment in time. This state is recorded as a _state object_. Entities constantly keep track of their state and write it into a state object, so that other entities/templates/frontend can access it. In the example&mdash;the light is on, at 50% brightness in orange&mdash;_on_ is the actual state of the light. 50% brightness and the color are entity state attributes.
| Field | Description |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `state.state` | String representation of the current state of the entity. Example `off`. |
| `state.entity_id` | Entity ID. Format: `<domain>.<object_id>`. Example: `light.kitchen`. |
| `state.domain` | Domain of the entity. Example: `light`. |
| `state.object_id` | Object ID of entity. Example: `kitchen`. |
| `state.name` | Name of the entity. Based on `friendly_name` attribute with fall back to object ID. Example: `Kitchen Ceiling`. |
| `state.last_changed` | Time the state changed in the state machine in UTC time. This is not updated if only state attributes change. Example: `2017-10-28 08:13:36.715874+00:00`. |
| `state.last_reported`| Time the state was written to the state machine in UTC time. This timestamp is updated regardless of any change to the state or a state attribute. Example: `2017-10-28 08:13:36.715874+00:00`. |
| `state.last_updated` | Time the state or state attributes changed in the state machine in UTC time. This is not updated if neither state nor state attributes changed. Example: `2017-10-28 08:13:36.715874+00:00`. |
| `state.attributes` | A dictionary with extra attributes related to the current state. |
| `state.context` | A dictionary with extra attributes related to the context of the state. |
### About the state object
## Attributes
The state object represents the state of an entity with its attributes at a specific point in time. All state objects will always have an entity id, a state, and timestamps when last updated, last changed, and last reported.
The `state` prefix indicates that this information is part of the state object (which is related to the entity). For example, `state.state` is the state of the entity at a given time.
The attributes of an {% term entity %} are optional.There are a few attributes that are available on all entities, such as `friendly_name` and `icon`. In addition to those, each integration has its own attributes to represent extra state data about the entity. For example, the light integration has attributes for the current brightness and color of the light. When an attribute is not available, Home Assistant will not write it to the state.
| Field | Description |
| --------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `state.state` | String representation of the current state of the entity. Example `off`. |
| `state.entity_id` | Entity ID. Format: `<domain>.<object_id>`. Example: `light.kitchen`. |
| `state.domain` | Domain of the entity. Example: `light`. |
| `state.object_id` | Object ID of entity. Example: `kitchen`. |
| `state.name` | Name of the entity. Based on `friendly_name` attribute with fall back to object ID. Example: `Kitchen ceiling`. |
| `state.last_changed` | Time the state changed in the state machine in UTC time. This is not updated if only state attributes change. Example: `2013-09-17 07:32:51.715874+00:00`. |
| `state.last_reported` | Time the state was written to the state machine in UTC time. This timestamp is updated regardless of any changes to the state or state attributes. Example: `2013-09-17 07:32:51.715874+00:00`. |
| `state.last_updated` | Time the state or state attributes changed in the state machine in UTC time. This is not updated if neither state nor state attributes changed. Example: `2013-09-17 07:32:51.715874+00:00`. |
| `state.attributes` | A dictionary with extra attributes related to the current state. |
| `state.context` | A dictionary with extra attributes related to the context of the state. |
### About the state
The screenshot shows three lights in different states (the `state.state`): `on`, `off`, and `unavailable`. Each light comes with its own entity state attributes such as `supported_color_modes`, `supported_features`. These attributes have their own state: the state of the `supported_color_modes` attribute is `color_temp` and `hs`, the state of the `supported_features` attribute is `4`.
<p class='img'>
<img src='/images/integrations/light/state_light.png' alt='Screenshot showing three lights with different states: `on`, `off`, or `unavailable`'>
Three lights with different states: `on`, `off`, or `unavailable`.
</p>
The `state.state` is the heart of the [state object](#about-the-state-object). State holds the information of interest of an entity. For example, if a
light is on or off, the current temperature, or the amount of energy used. The state object stores 3
timestamps related to the state: `last_updated`, `last_changed`, and `last_reported`. Each
entity has exactly one state, and the state only holds one value at a time.
### About entity state attributes
The state only holds one value at a time. However, entities can store related entity state attributes in the state object. For example,
the state of a light is _on_, and the related attributes could be its
current brightness and color values. [State change events](/docs/configuration/events/#events-and-state-changes) can be used as triggers.
The current state can be used in [conditions](/docs/automation/condition/). The example below shows three lights with different entity state attributes.
<p class='img'>
<img src='/images/integrations/light/state_light.png' alt='Screenshot showing three lights with different states and attributes'>
Example showing three lights with different entity state attributes.
</p>
Entities have some attributes that are not related to its state, such as `friendly_name`. A few attributes are available on all entities, such as `friendly_name` or `icon`. In addition to those, each integration has its own attributes to represent extra state data about the entity. For example, the light integration has attributes for the current brightness and color of the light. When an attribute is not available, Home Assistant will not write it to the state. Entity attributes are optional.
When using templates, attributes will be available by their name. For example `state.attributes.assumed_state`.
| Attribute | Description |
| --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `friendly_name` | Name of the entity. Example: `Kitchen Ceiling`. |
| `icon` | Icon to use for the entity in the frontend. Example: `mdi:home`. |
| `entity_picture` | URL to a picture that should be used instead of showing the domain icon. Example: `http://example.com/picture.jpg`. |
| `assumed_state` | Boolean if the current state is an assumption. [More info](/blog/2016/02/12/classifying-the-internet-of-things/#classifiers) Example: `True`. |
| `unit_of_measurement` | The unit of measurement the state is expressed in. Used for grouping graphs or understanding the entity. Example: `°C`. |
The table lists common state attributes that may be present, depending on the entity domain.
| Attribute | Description |
| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `friendly_name` | Name of the entity. Example: `Kitchen Ceiling`. |
| `icon` | Icon to use for the entity in the frontend. Example: `mdi:home`. |
| `entity_picture` | URL to a picture that should be used instead of showing the domain icon. Example: `http://example.com/picture.jpg`. |
| `assumed_state` | Boolean if the current state is an assumption. [More info](/blog/2016/02/12/classifying-the-internet-of-things/#classifiers) Example: `True`. |
| `unit_of_measurement` | The unit of measurement the state is expressed in. Used for grouping graphs or understanding the entity. Example: `°C`. |
| `attribution` | The provider of the data. For example, "Data provided by rejseplanen.dk", "Data provided by openSenseMap" |
| `device_class` | The type of device that an entity represents. Used to display device specific information in the UI. |
| `supported_features` | The features an entity supports. For covers, for example, it might list `opening`, `closing`, `stopping`, `setting position`. For media players, it might list `play`, `pause`, `stop`, and `volume control` |
When an attribute contains spaces, you can retrieve it like this: `state_attr('sensor.livingroom', 'Battery numeric')`.
## Context
Context is used to tie {% term events %} and {% term states %} together in Home Assistant. Whenever an {% term automation %} or user interaction causes states to change, a new context is assigned. This context will be attached to all events and states that happen as result of the change.
Context is a property used in state objects and events. It ties {% term events %} and {% term states %} together in Home Assistant. Whenever an {% term automation %} or user interaction causes a state to change, a new context is assigned in the state object. This context will be attached to all events and states that happen as a result of the change.
| Field | Description |
| ------------ | ------------------------------------------------------------------- |
| `context_id` | Unique identifier for the context. |
| `user_id` | Unique identifier of the user that started the change. Will be `None` if the action was not started by a user (for example, started by an automation). |
| `parent_id` | Unique identifier of the parent context that started the change, if available. For example, if an automation is triggered, the context of the trigger will be set as parent. |
| Field | Description |
| ------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `context_id` | Unique identifier for the context. |
| `user_id` | Unique identifier of the user that started the change. Will be `None` if the action was not started by a user (for example, started by an automation). |
| `parent_id` | Unique identifier of the parent context that started the change, if available. For example, if an automation is triggered, the context of the trigger will be set as parent. |

View File

@ -106,6 +106,10 @@ Extensions allow templates to access all of the Home Assistant specific states a
Templates for some [triggers](/docs/automation/trigger/) as well as `trigger_variables` only support a subset of the Home Assistant template extensions. This subset is referred to as "Limited Templates".
### This
State-based and trigger-based template entities have the special template variable `this` available in their templates and actions. See more details and examples in the [Template integration documentation](/integrations/template).
### States
Not supported in [limited templates](#limited-templates).
@ -318,7 +322,7 @@ List of lights that are on with a brightness of 255:
{% raw %}
```text
{{ ['light.kitchen', 'light.dinig_room'] | select('is_state', 'on') | select('is_state_attr', 'brightness', 255) | list }}
{{ ['light.kitchen', 'light.dining_room'] | select('is_state', 'on') | select('is_state_attr', 'brightness', 255) | list }}
```
{% endraw %}
@ -469,6 +473,7 @@ The same thing can also be expressed as a test:
- `floor_id(lookup_value)` returns the floor ID for a given device ID, entity ID, area ID, or area name. Can also be used as a filter.
- `floor_name(lookup_value)` returns the floor name for a given device ID, entity ID, area ID, or floor ID. Can also be used as a filter.
- `floor_areas(floor_name_or_id)` returns the list of area IDs tied to a given floor ID or name. Can also be used as a filter.
- `floor_entities(floor_name_or_id)` returns the list of entity IDs tied to a given floor ID or name. Can also be used as a filter.
#### Floors examples
@ -714,10 +719,10 @@ For example, if you wanted to select a field from `trigger` in an automation bas
### Time
`now()`, `relative_time()`, `today_at()`, and `utcnow()` are not supported in [limited templates](#limited-templates).
`now()`, `time_since()`, `time_until()`, `today_at()`, and `utcnow()` are not supported in [limited templates](#limited-templates).
- `now()` returns a datetime object that represents the current time in your time zone.
- You can also use: `now().second`, `now().minute`, `now().hour`, `now().day`, `now().month`, `now().year`, `now().weekday()` and `now().isoweekday()` and other [`datetime`](https://docs.python.org/3.8/library/datetime.html#datetime.datetime) attributes and functions.
- You can also use: `now().second`, `now().minute`, `now().hour`, `now().day`, `now().month`, `now().year`, `now().weekday()` and `now().isoweekday()` and other [`datetime`](https://docs.python.org/3/library/datetime.html#datetime.datetime) attributes and functions.
- Using `now()` will cause templates to be refreshed at the start of every new minute.
- `utcnow()` returns a datetime object of the current time in the UTC timezone.
- For specific values: `utcnow().second`, `utcnow().minute`, `utcnow().hour`, `utcnow().day`, `utcnow().month`, `utcnow().year`, `utcnow().weekday()` and `utcnow().isoweekday()`.
@ -738,7 +743,7 @@ For example, if you wanted to select a field from `trigger` in an automation bas
- `as_datetime(value, default)` converts a string containing a timestamp, or valid UNIX timestamp, to a datetime object. If that fails, it returns the `default` value or, if omitted, raises an error. When the input is already a datetime object it will be returned as is. in case the input is a datetime.date object, midnight will be added as time. This function can also be used as a filter.
- `as_timestamp(value, default)` converts a datetime object or string to UNIX timestamp. If that fails, returns the `default` value, or if omitted raises an error. This function can also be used as a filter.
- `as_local()` converts a datetime object to local time. This function can also be used as a filter.
- `strptime(string, format, default)` parses a string based on a [format](https://docs.python.org/3.10/library/datetime.html#strftime-and-strptime-behavior) and returns a datetime object. If that fails, it returns the `default` value or, if omitted, raises an error.
- `strptime(string, format, default)` parses a string based on a [format](https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior) and returns a datetime object. If that fails, it returns the `default` value or, if omitted, raises an error.
- `time_since(datetime, precision)` converts a datetime object into its human-readable time string. The time string can be in seconds, minutes, hours, days, months, and years. `precision` takes an integer (full number) and indicates the number of units returned. The last unit is rounded. For example: `precision = 1` could return "2 years" while `precision = 2` could return "1 year 11 months". This function can also be used as a filter.
If the datetime is in the future, returns 0 seconds.
A precision of 0 returns all available units, default is 1.
@ -1169,6 +1174,31 @@ Some examples:
</div>
### Hashing
The template engine contains a few filters and functions to hash a string of
data. A few very common hashing algorithms are supported: `md5`, `sha1`,
`sha256`, and `sha512`.
Some examples:
{% raw %}
- `{{ md5("Home Assistant") }}` - renders as `f3f2b8b3b40084aa87e92b7ffb02ed13885fea2d07`
- `{{ "Home Assistant" | md5 }}` - renders as `f3f2b8b3b40084aa87e92b7ffb02ed13885fea2d07`
- `{{ sha1("Home Assistant") }}` - renders as `14bffd017c73917bfda2372aaf287570597b8e82`
- `{{ "Home Assistant" | sha1 }}` - renders as `14bffd017c73917bfda2372aaf287570597b8e82`
- `{{ sha256("Home Assistant") }}` - renders as `a18f473c9d3ed968a598f996dcf0b9de84de4ee04c950d041b61297a25bcea49`
- `{{ "Home Assistant" | sha256 }}` - renders as `a18f473c9d3ed968a598f996dcf0b9de84de4ee04c950d041b61297a25bcea49`
- `{{ sha512("Home Assistant") }}` - renders as `f251e06eb7d3439e1a86d6497d6a4531c3e8c809f538be62f89babf147d7d63aca4e77ae475b94c654fd38d8f543f778ce80007d6afef379d8a0e5d3ddf7349d`
- `{{ "Home Assistant" | sha512 }}` - renders as `f251e06eb7d3439e1a86d6497d6a4531c3e8c809f538be62f89babf147d7d63aca4e77ae475b94c654fd38d8f543f778ce80007d6afef379d8a0e5d3ddf7349d`
{% endraw %}
### Regular expressions
For more information on regular expressions
@ -1176,10 +1206,141 @@ See: [Python regular expression operations](https://docs.python.org/3/library/re
- Test `string is match(find, ignorecase=False)` will match the find expression at the beginning of the string using regex.
- Test `string is search(find, ignorecase=False)` will match the find expression anywhere in the string using regex.
- Filter `string|regex_replace(find='', replace='', ignorecase=False)` will replace the find expression with the replace string using regex.
- Filter `string|regex_replace(find='', replace='', ignorecase=False)` will replace the find expression with the replace string using regex. Access to the matched groups in `replace` is possible with `'\\1'`, `'\\2'`, etc.
- Filter `value | regex_findall(find='', ignorecase=False)` will find all regex matches of the find expression in `value` and return the array of matches.
- Filter `value | regex_findall_index(find='', index=0, ignorecase=False)` will do the same as `regex_findall` and return the match at index.
### Shuffling
The template engine contains a filter and function to shuffle a list.
Shuffling can happen randomly or reproducibly using a seed. When using a seed
it will always return the same shuffled list for the same seed.
Some examples:
{% raw %}
- `{{ [1, 2, 3] | shuffle }}` - renders as `[3, 1, 2]` (_random_)
- `{{ shuffle([1, 2, 3]) }}` - renders as `[3, 1, 2]` (_random_)
- `{{ shuffle(1, 2, 3) }}` - renders as `[3, 1, 2]` (_random_)
- `{{ [1, 2, 3] | shuffle("random seed") }}` - renders as `[2, 3, 1] (_reproducible_)
- `{{ shuffle([1, 2, 3], seed="random seed") }}` - renders as `[2, 3, 1] (_reproducible_)
- `{{ shuffle([1, 2, 3], "random seed") }}`- renders as `[2, 3, 1] (_reproducible_)
- `{{ shuffle(1, 2, 3, seed="random seed") }}` - renders as `[2, 3, 1] (_reproducible_)
{% endraw %}
### Flatten a list of lists
The template engine provides a filter to flatten a list of lists: `flatten`.
It will take a list of lists and return a single list with all the elements.
The depth of the flattening can be controlled using the `levels` parameter.
The flattening process is recursive, so it will flatten all nested lists, until
the number of levels (if specified) is reached.
Some examples:
{% raw %}
- `{{ flatten([1, [2, [3]], 4, [5 , 6]]) }}` - renders as `[1, 2, 3, 4, 5, 6]`
- `{{ [1, [2, [3]], 4, [5 , 6]] | flatten }}` - renders as `[1, 2, 3, 4, 5, 6]`
- `{{ flatten([1, [2, [3]]], levels=1) }}` - renders as `[1, 2, [3]]`
- `{{ [1, [2, [3]]], flatten(levels=1) }}` - renders as `[1, 2, [3]]`
- `{{ flatten([1, [2, [3]]], 1) }}` - renders as `[1, 2, [3]]`
- `{{ [1, [2, [3]]], flatten(1) }}` - renders as `[1, 2, [3]]`
{% endraw %}
### Find common elements between lists
The template engine provides a filter to find common elements between two lists: `intersect`.
This function returns a list containing all elements that are present in both input lists.
Some examples:
{% raw %}
- `{{ intersect([1, 2, 5, 3, 4, 10], [1, 2, 3, 4, 5, 11, 99]) }}` - renders as `[1, 2, 3, 4, 5]`
- `{{ [1, 2, 5, 3, 4, 10] | intersect([1, 2, 3, 4, 5, 11, 99]) }}` - renders as `[1, 2, 3, 4, 5]`
- `{{ intersect(['a', 'b', 'c'], ['b', 'c', 'd']) }}` - renders as `['b', 'c']`
- `{{ ['a', 'b', 'c'] | intersect(['b', 'c', 'd']) }}` - renders as `['b', 'c']`
{% endraw %}
### Find elements in first list not in second list
The template engine provides a filter to find elements that are in the first list but not in the second list: `difference`.
This function returns a list containing all elements that are present in the first list but absent from the second list.
Some examples:
{% raw %}
- `{{ difference([1, 2, 5, 3, 4, 10], [1, 2, 3, 4, 5, 11, 99]) }}` - renders as `[10]`
- `{{ [1, 2, 5, 3, 4, 10] | difference([1, 2, 3, 4, 5, 11, 99]) }}` - renders as `[10]`
- `{{ difference(['a', 'b', 'c'], ['b', 'c', 'd']) }}` - renders as `['a']`
- `{{ ['a', 'b', 'c'] | difference(['b', 'c', 'd']) }}` - renders as `['a']`
{% endraw %}
### Find elements that are in either list but not in both
The template engine provides a filter to find elements that are in either of the input lists but not in both: `symmetric_difference`.
This function returns a list containing all elements that are present in either the first list or the second list, but not in both.
Some examples:
{% raw %}
- `{{ symmetric_difference([1, 2, 5, 3, 4, 10], [1, 2, 3, 4, 5, 11, 99]) }}` - renders as `[10, 11, 99]`
- `{{ [1, 2, 5, 3, 4, 10] | symmetric_difference([1, 2, 3, 4, 5, 11, 99]) }}` - renders as `[10, 11, 99]`
- `{{ symmetric_difference(['a', 'b', 'c'], ['b', 'c', 'd']) }}` - renders as `['a', 'd']`
- `{{ ['a', 'b', 'c'] | symmetric_difference(['b', 'c', 'd']) }}` - renders as `['a', 'd']`
{% endraw %}
### Combine all unique elements from two lists
The template engine provides a filter to combine all unique elements from two lists: `union`.
This function returns a list containing all unique elements that are present in either the first list or the second list.
Some examples:
{% raw %}
- `{{ union([1, 2, 5, 3, 4, 10], [1, 2, 3, 4, 5, 11, 99]) }}` - renders as `[1, 2, 3, 4, 5, 10, 11, 99]`
- `{{ [1, 2, 5, 3, 4, 10] | union([1, 2, 3, 4, 5, 11, 99]) }}` - renders as `[1, 2, 3, 4, 5, 10, 11, 99]`
- `{{ union(['a', 'b', 'c'], ['b', 'c', 'd']) }}` - renders as `['a', 'b', 'c', 'd']`
- `{{ ['a', 'b', 'c'] | union(['b', 'c', 'd']) }}` - renders as `['a', 'b', 'c', 'd']`
{% endraw %}
### Combining dictionaries
The template engine provides a function and filter to merge multiple dictionaries: `combine`.
It will take multiple dictionaries and merge them into a single dictionary. When used as a filter,
the filter value is used as the first dictionary. The optional `recursive` parameter determines
whether nested dictionaries should be merged (defaults to `False`).
Some examples:
{% raw %}
- `{{ {'a': 1, 'b': 2} | combine({'b': 3, 'c': 4}) }}` - renders as `{'a': 1, 'b': 3, 'c': 4}`
- `{{ combine({'a': 1, 'b': 2}, {'b': 3, 'c': 4}) }}` - renders as `{'a': 1, 'b': 3, 'c': 4}`
- `{{ combine({'a': 1, 'b': {'x': 1}}, {'b': {'y': 2}, 'c': 4}, recursive=True) }}` - renders as `{'a': 1, 'b': {'x': 1, 'y': 2}, 'c': 4}`
- `{{ combine({'a': 1, 'b': {'x': 1}}, {'b': {'y': 2}, 'c': 4}) }}` - renders as `{'a': 1, 'b': {'y': 2}, 'c': 4}`
{% endraw %}
## Merge action responses
Using action responses we can collect information from various entities at the same time.
@ -1459,12 +1620,14 @@ To evaluate a response, go to **{% my developer_template title="Developer Tools
### Using templates with the MQTT integration
The [MQTT integration](/integrations/mqtt/) relies heavily on templates. Templates are used to transform incoming payloads (value templates) to status updates or incoming actions (command templates) to payloads that configure the MQTT device.
The [MQTT integration](/integrations/mqtt/) relies heavily on templates. Templates are used to transform incoming payloads (value templates) to state updates or incoming actions (command templates) to payloads that configure the MQTT device.
#### Using value templates with MQTT
For incoming data a value template translates incoming JSON or raw data to a valid payload.
Incoming payloads are rendered with possible JSON values, so when rendering the `value_json` can be used access the attributes in a JSON based payload.
Value templates translate received MQTT payload to a valid state or attribute.
The received MQTT is available in the `value` template variable, and in the `value_json` template variable if the received MQTT payload is valid JSON.
In addition, the template variables `entity_id`, `name` and `this` are available for MQTT entity value templates. The `this` attribute refers to the [entity state](/docs/configuration/state_object) of the MQTT item.
{% note %}
@ -1478,13 +1641,13 @@ With given payload:
Template {% raw %}`{{ value_json.temperature | round(1) }}`{% endraw %} renders to `21.9`.
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.
{% endnote %}
#### Using command templates with MQTT
For actions, command templates are defined to format the outgoing MQTT payload to the device. When an action is executed, `value` can be used to generate the correct payload to the device.
For actions, command templates are defined to format the outgoing MQTT payload to a format supported by the remote device. When an action is executed, the template variable `value` has the action data in most cases unless otherwise specified in the documentation.
In addition, the template variables `entity_id`, `name` and `this` are available for MQTT entity command templates. The `this` attribute refers to the [entity state](/docs/configuration/state_object) of the MQTT item.
{% note %}
@ -1498,8 +1661,6 @@ 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.
{% endnote %}
**Example command template with raw data:**
@ -1510,6 +1671,44 @@ When a command template renders to a valid `bytes` literal, then MQTT will publi
- Template {% raw %}`{{ 16 }}`{% endraw %} renders to payload encoded string `"16"`.
- Template {% raw %}`{{ pack(0x10, ">B") }}`{% endraw %} renders to a raw 1 byte payload `0x10`.
### Determining types
When working with templates, it can be useful to determine the type of
the returned value from a method or the type of a variable at times.
For this, Home Assistant provides the `typeof()` template function and filter,
which is inspired by the [JavaScript](https://en.wikipedia.org/wiki/JavaScript)
`typeof` operator. It reveals the type of the given value.
This is mostly useful when you are debugging or playing with templates in
the developer tools of Home Assistant. However, it might be useful in some
other cases as well.
Some examples:
{% raw %}
- `{{ typeof(42) }}` - renders as `int`
- `{{ typeof(42.0) }}` - renders as `float`
- `{{ typeof("42") }}` - renders as `str`
- `{{ typeof([1, 2, 3]) }}` - renders as `list`
- `{{ typeof({"key": "value"}) }}` - renders as `dict`
- `{{ typeof(True) }}` - renders as `bool`
- `{{ typeof(None) }}` - renders as `NoneType`
- `{{ 42 | typeof }}` - renders as `int`
- `{{ 42.0 | typeof }}` - renders as `float`
- `{{ "42" | typeof }}` - renders as `str`
- `{{ [1, 2, 3] | typeof }}` - renders as `list`
- `{{ {"key": "value"} | typeof }}` - renders as `dict`
- `{{ True | typeof }}` - renders as `bool`
- `{{ None | typeof }}` - renders as `NoneType`
- `{{ some_variable | typeof }}` - renders the type of `some_variable`
- `{{ states("sensor.living_room") | typeof }}` - renders the type of the result of `states()` function
{% endraw %}
## Some more things to keep in mind
### `entity_id` that begins with a number

View File

@ -30,8 +30,8 @@ One of the most common problems with Home Assistant is an invalid {% term "`conf
- [Supervised](/common-tasks/supervised/#configuration-check)
- The configuration files, including {% term "`configuration.yaml`" %} must be UTF-8 encoded. If you see error like `'utf-8' codec can't decode byte`, edit the offending configuration and re-save it as UTF-8.
- You can verify your configuration's YAML structure using [this online YAML parser](https://yaml-online-parser.appspot.com/) or [YAML Validator](https://codebeautify.org/yaml-validator/).
- To learn more about the quirks of YAML, read [YAML IDIOSYNCRASIES](https://docs.saltproject.io/en/latest/topics/troubleshooting/yaml_idiosyncrasies.html) by SaltStack (the examples there are specific to SaltStack, but do explain YAML issues well).
- You can verify your configuration's {% term YAML %} structure using [this online YAML parser](https://yaml-online-parser.appspot.com/) or [YAML Validator](https://codebeautify.org/yaml-validator/).
- To learn more about the quirks of {% term YAML %}, read [YAML IDIOSYNCRASIES](https://docs.saltproject.io/en/latest/topics/troubleshooting/yaml_idiosyncrasies.html) by SaltStack (the examples there are specific to SaltStack, but do explain YAML issues well).
`configuration.yaml` does not allow multiple sections to have the same name. If you want to load multiple platforms for one integration, you can append a number or string to the name or nest them:
@ -100,7 +100,7 @@ The only characters valid in entity names are:
- Numbers
- Underscores
The entity name must not start or end with an underscore. If you create an entity with other characters from the UI, Home Assistant validates the name. If you change the name directly in the YAML file, then Home Assistant may not generate an error for that entity. However, attempts to use that entity will generate errors (or possibly fail silently).
The entity name must not start or end with an underscore. If you create an entity with other characters from the UI, Home Assistant validates the name. If you change the name directly in the {% term YAML %} file, then Home Assistant may not generate an error for that entity. However, attempts to use that entity will generate errors (or possibly fail silently).
For instructions on how to change an entity name, refer to the section on [customizing entities](/docs/configuration/customizing-devices/).

View File

@ -35,7 +35,7 @@ There are also products for water usage monitoring that are based on existing co
- [Z-Wave](/integrations/zwave_js)
- [Zigbee](/integrations/zha)
- [Matter (BETA)](/integrations/matter)
- [Matter](/integrations/matter)
## Community-made sensors

View File

@ -1,31 +0,0 @@
---
title: "Glossary"
description: "Home Assistant's Glossary."
---
{% assign entries = site.data.glossary | sort: 'term' %}
The glossary covers terms which are used around Home Assistant.
<div class="config-vars basic">
{% for entry in entries %}
<div class="config-vars-item">
<div class="config-vars-label">
<a name="{{ entry.term | slugify }}" class="title-link" href="#{{ entry.term | slugify }}"></a>
<span class="config-vars-label-name">{{ entry.term }}</span>
</div>
<div class="config-vars-description-and-children">
<span class="config-vars-description">
{{ entry.definition | markdownify | newline_to_br }}
{%- if entry.link -%}
<a href="{{ entry.link }}">Read more about: {{ entry.term }}</a>
{%- endif -%}
</span>
</div>
</div>
{% endfor %}
</div>

View File

@ -0,0 +1,33 @@
---
title: "Glossary"
description: "Home Assistant's Glossary."
---
The glossary covers terms which are used around Home Assistant.
{% assign entries = site.data.glossary | sort: 'term' %}
{% assign current_letter = '' %}
{% for entry in entries %}
{% assign first_letter = entry.term | slice: 0 %}
{% if first_letter != current_letter %}
{% assign current_letter = first_letter | upcase %}
## {{ current_letter }}
---
{% endif %}
### {{ entry.term }}
{{ entry.definition | markdownify }}
{%- if entry.link -%}
{{ "[Read more about " | append: "_" | append: entry.term | append: "_](" | append: entry.link | append: ")" | markdownify }}
{%- endif -%}
{% endfor %}

View File

@ -15,19 +15,42 @@ or need to recover your data.
## Forgot username
If youve forgotten your username, ask the owner to help you.
If you are using the {% term "Home Assistant Operating System" %} and have access to the Home Assistant server, you can connect a terminal and enter the `auth list` command. This command lists all users that are registered on your Home Assistant.
### Symptom: I'm the owner and I forgot my username
You are the **owner** of the Home Assistant server and you cannot login because you forgot your username.
#### Remedy
1. Check if the following conditions are met:
- you are using the {% term "Home Assistant Operating System" %}
- you have access to the Home Assistant server.
2. Open a terminal connection to Home Assistant:
- 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/)
- [to access the console from Linux or macOS](https://yellow.home-assistant.io/guides/use-serial-console-linux-macos/).
- If you are using another system, connect keyboard and monitor. The procedure might be similar the one used for Green.
- If you are using a Home Assistant OVA (virtualization image):
- Access the system console by opening the terminal through your virtualization platform's interface (for example, Proxmox, VMware, VirtualBox).
- Follow the platform-specific steps to interact with the virtual machine's console.
3. In the terminal, enter the `auth list` command.
- This command lists all users that are registered on your Home Assistant.
## Forgot password
If you are not the owner or do not have administrator rights, ask the owner to give you a new password.
### Symptom: I'm the owner and I forgot my password
- In the navigation pane on the left, check if you see the **Settings** menu listed above the **Notifications**.
- If you don't, you do not have administrator rights.
You are the owner or administrator of Home Assistant and forgot your password.
If you are the owner or have administrator, there are different methods to reset a password, depending on your setup:
### Remedy: resetting an owner's password
### To reset a password while still logged in (including Supervised)
If you are the owner or have administrator, there are different methods to reset a password, depending on your situation:
- [Reset a password while still logged in](#to-reset-a-password-while-still-logged-in-including-supervised)
- [Reset an owner's password when logged out](#to-reset-an-owners-password-via-console)
- [reset a user's password, via the container command line](#to-reset-a-users-password-via-the-container-command-line)
#### To reset a password while still logged in (including Supervised)
The method used to reset a password depends on your user rights:
@ -40,12 +63,12 @@ The method used to reset a password depends on your user rights:
2. Reset your password via this new administrator account (and then [delete this new account](/docs/locked_out/#to-delete-a-user)).
- Your configuration will remain, and you don't have to do a new onboarding process.
### To reset an owner's password, via console
#### To reset an owner's password, via console
Use this procedure only if the following conditions are met:
- You know the username.
- You can access the [Home Assistant console](/hassio/commandline/) **on the device itself** (not via the SSH terminal from the add-ons).
- You can access the Home Assistant console **on the device itself** (not via the SSH terminal from the add-ons).
1. If you are using a Home Assistant Yellow or Green, refer to their documentation.
- If you are using a Home Assistant Yellow, refer to the following procedure:
@ -58,22 +81,22 @@ Use this procedure only if the following conditions are met:
3. Once you have opened the Home Assistant command line, enter the following command:
- Note: `existing_user` is a placeholder. Replace it with your username.
- Note: `new_password` is a placeholder. Replace it with your new password.
- **Command**: `auth reset --username existing_user --password new_password`
- **Command**: `auth reset --username 'existing_user' --password 'new_password'`
![Screencast showing how to enter the ha auth reset command](/images/docs/troubleshooting/home-assistant-cli.webp)
- **Troubleshooting**: If you see the message `zsh: command not found: auth`, you likely did not enter the command in the serial console connected to the device itself, but in the terminal within Home Assistant.
4. You can now log in to Home Assistant using this new password.
### To reset a user's password, via the container command line
#### To reset a user's password, via the container command line
If you are running Home Assistant in a container, you can use the command line in the container with the `hass` command to change your password. The steps below refer to a Home Assistant container in Docker named `homeassistant`. Note that while working in the container, commands will take a few moments to execute.
1. `docker exec -it homeassistant bash` to open to the container command line
2. `hass` to create a default user, if this is your first time using the tool
3. `hass --script auth --config /config change_password existing_user new_password` to change the password
4. `exit` to exit the container command line
5. `docker restart homeassistant` to restart the container.
### To reset a user's password, as an owner via the web interface
#### To reset a user's password, as an owner via the web interface
Only the owner can change other user's passwords.
@ -85,17 +108,7 @@ Only the owner can change other user's passwords.
5. Confirm the new password by entering it again, and select **OK** again.
6. A confirmation box will be displayed with the text **Password was changed successfully**.
### To delete a user
You need to be an owner or have administrator rights to delete a user.
1. Go to {% my people title="**Settings** > **People**" %} and select the person which you want to delete.
- Note: you cannot delete the owner.
2. At the bottom of the dialog box, select **Delete**.
- A confirmation dialog box will be displayed.
3. To confirm, select **OK**.
### To prepare the system to start a new onboarding process
## Preparing the system to start a new onboarding process
If you lose the password associated with the owner account and the steps above do not work to reset the password, the only way to resolve this is to start a new onboarding process.
@ -139,3 +152,13 @@ For Windows or macOS you will need third party software. Below are some options.
- Windows: <https://www.diskinternals.com/linux-reader/> (read-only access to the SD)
- macOS: <https://osxfuse.github.io/>
## Deleting a user
You need to be an owner or have administrator rights to delete a user.
1. Go to {% my people title="**Settings** > **People**" %} and select the person which you want to delete.
- Note: you cannot delete the owner.
2. At the bottom of the dialog box, select **Delete**.
- A confirmation dialog box will be displayed.
3. To confirm, select **OK**.

View File

@ -1,29 +1,150 @@
---
title: "Quality Scale"
title: "Quality scale"
description: "Details about the classification of integrations."
related:
- url: https://developers.home-assistant.io/docs/core/integration-quality-scale/
title: Developer documentation on the integration quality scale
---
The Integration Quality Scale scores each integration based on the code quality and user experience. Each level of the quality scale consists of a list of requirements. If an integration matches all requirements, it's considered to have reached that level.
The integration quality scale is a framework for Home Assistant to grade integrations based on user experience, features, code quality, and developer experience.
To grade this, the project has come up with a set of tiers, each with its own set of criteria.
[Integration Quality Scale](https://developers.home-assistant.io/docs/en/integration_quality_scale_index.html) for developers.
## Scaled tiers
## No score
There are 4 scaled tiers, bronze, silver, gold, and platinum.
To reach a tier, the integration must fulfill all rules of that tier and the tiers below.
This integration passes the bare minimum requirements. That's the level of most integrations when they are introduced into Home Assistant. It doesn't mean that they are bad or buggy, just that you need to configure them with an entry in your {% term "`configuration.yaml`" %} file.
These tiers are defined as follows.
## Silver 🥈
### 🥉 Bronze
This integration is able to cope when things go wrong. It will not print any exceptions nor will it fill the log with retry attempts. Also, it will show you if a device is offline or not ready when you start Home Assistant.
The bronze tier is the baseline standard and requirement for all new integrations. It meets the minimum requirements in code quality, functionality, and user experience. It complies with the fundamental expectations and provides a reliable foundation for users to interact with their devices and services.
## Gold 🥇
The documentation provides guidelines for setting up the integration directly from the Home Assistant user interface.
This is a solid integration that is able to survive poor conditions and can be configured via the user interface.
From a technical perspective, this integration has been reviewed to comply with all baseline standards, which we require for all new integrations, including automated tests for setting up the integration.
## Platinum 🏆
The bronze tier has the following characteristics:
Best of the best. The integration is completely async, meaning it's super fast and gives you an excellent user experience.
- Can be easily set up through the UI.
- The source code adheres to basic coding standards and development guidelines.
- Automated tests that guard this integration can be configured correctly.
- Offers basic end-user documentation that is enough to get users started step-by-step easily.
## Internal 🏠
### 🥈 Silver
All integrations which are marked as **internal** are part of Home Assistant.
The silver tier builds upon the _Bronze_ level by improving the reliability and robustness of integrations, ensuring a solid runtime experience. It ensures an integration handles errors properly, such as when authentication to a device or service fails, handles offline devices, and other errors.
The documentation for these integrations provides information on what is available in Home Assistant when this integration is used, as well as troubleshooting information when issues occur.
This integration has one or more active code owners who help maintain it to ensure the experience on this level lasts now and in the future.
The silver tier has the following characteristics:
- Provides everything the _Bronze_ tier has.
- Provides a stable user experience under various conditions.
- Has one or more active code owners who help maintain the integration.
- Correctly and automatically recover from connection errors or offline devices, without filling log files and without unnecessary messages.
- Automatically triggers re-authentication if authentication with the device or service fails.
- Offers detailed documentation of what the integration provides and instructions for troubleshooting issues.
### 🥇 Gold
The gold standard in integration user experience, providing extensive and comprehensive support for the integrated devices & services. A gold-tier integration aims to be user-friendly, fully featured, and accessible to a wider audience.
When possible, devices are automatically discovered for an easy and seamless setup, and their firmware/software can be directly updated from Home Assistant.
All provided devices and entities are named logically and fully translatable, and they have been properly categorized and enabled for long-term statistical use.
The documentation for these integrations is extensive, and primarily aimed toward end-users and understandable by non-technical consumers. Besides providing general information on the integration, the documentation provides possible example use cases, a list of compatible devices, a list of described entities the integration provides, and extensive descriptions and usage examples of available actions provided by the integration. The use of example automations, dashboards, available Blueprints, and links to additional external resources, is highly encouraged as well.
The integration provides means for debugging issues, including downloading diagnostic information and documenting troubleshooting instructions. If needed, the integration can be reconfigured via the UI.
From a technical perspective, the integration needs to have full automated test coverage of its codebase to ensure the set integration quality is maintained now and in the future.
All integrations that have devices in the Works with Home Assistant program are at least required to have this tier.
The gold tier has the following characteristics:
- Provides everything the _Silver_ tier has.
- Has the best end-user experience an integration can offer; streamlined and intuitive.
- Can be automatically discovered, simplifying the integration setup.
- Integration can be reconfigured and adjusted.
- Supports translations.
- Extensive documentation, aimed at non-technical users.
- It supports updating the software/firmware of devices through Home Assistant when possible.
- The integration has automated tests covering the entire integration.
- Required level for integrations providing devices in the Works with Home Assistant program.
### 🏆 Platinum
Platinum is the highest tier an integration can reach, the epitome of quality within Home Assistant. It not only provides the best user experience but also achieves technical excellence by adhering to the highest standards, supreme code quality, and well-optimized performance and efficiency.
The platinum tier has the following characteristics:
- Provides everything the _Gold_ tier has.
- All source code follows all coding and Home Assistant integration standards and best practices and is fully typed with type annotations and clear code comments for better code clarity and maintenance.
- A fully asynchronous integration code base ensures efficient operation.
- Implements efficient data handling, reducing network and CPU usage.
## Special tiers
There are 4 special tiers that are used for integrations that don't have a place on the scaled tier list.
This is because they are either an internal part of {% term "Home Assistant Core" %}, they are not in {% term "Home Assistant Core" %} at all, or they don't meet the minimum requirements to be graded against the scaled tiers.
The special tiers are defined as follows.
### ❓ No score
These integrations can be set up through the Home Assistant user interface. The _No score_ designation doesnt imply that they are bad or buggy, instead, it indicates that they havent been assessed according to the quality scale or that they need some maintenance to reach the now-considered minimum _Bronze_ standard.
The _No score_ tier cannot be assigned to new integrations, as they are required to have at least a _Bronze_ level when introduced. The Home Assistant project encourages the community to help update these integrations without a score to meet at least the _Bronze_ level requirements.
Characteristics:
- Not yet scored or lacks sufficient information for scoring.
- Can be set up via the UI, but may need enhancements for a better experience.
- May function correctly, but hasnt been verified against current standards.
- Documentation most often provides only basic setup steps.
### 🏠 Internal
The internal tier is assigned to integrations used internally by Home Assistant. These integrations provide basic components and building blocks for the Home Assistant Core program or for other integrations to build on top of it.
Internal integrations are maintained by the Home Assistant project and subjected to strict architectural design procedures.
Characteristics:
- Internal, built-in building blocks of the Home Assistant Core program.
- Provides building blocks for other integrations to use and build on top of.
- Maintained by the Home Assistant project.
### 💾 Legacy
Legacy integrations are older integrations that have been part of Home Assistant for many years, possibly since its inception. They can only be configured through {% term YAML %} files and often lack active maintainers (code owners). These integrations might be complex to set up and do not adhere to current/modern end-user expectations in their use and features.
The Home Assistant project encourages the community to help migrate these integrations to the UI and update them to meet modern standards, making these integrations accessible to everyone.
Characteristics:
- Complex setup process; only configurable via {% term YAML %}, without UI-based setup.
- May lack active code ownership and maintenance.
- Could be missing recent updates or bug fixes.
- Documentation may still be aimed at developers.
### 📦 Custom
Custom integrations are developed and distributed by the community, and offer additional functionalities and support for devices and services to Home Assistant. These integrations are not included in the official Home Assistant releases and can be installed manually or via third-party tools like HACS (Home Assistant Community Store).
The Home Assistant project does not review, security audit, maintain, or support third-party custom integrations. Users are encouraged to exercise caution and review the custom integrations source and community feedback before installation.
Developers are encouraged and invited to contribute their custom integration to the Home Assistant project by aligning them with the integration quality scale and submitting them for inclusion.
Characteristics:
- Not included in the official Home Assistant releases.
- Manually installable or installable via community tools, like <abbr title="Home Assistant Community Store">HACS</abbr>.
- Maintained by individual developers or community members.
- User experience may vary widely.
- Functionality, security, and stability can vary widely.
- Documentation may be limited.

View File

@ -24,12 +24,11 @@ scene:
media_player.sony_bravia_tv:
state: "on"
source: HDMI 1
state: "on"
```
## How to configure your scene
In the scene you define in your YAML files, please ensure you use
In the scene you define in your {% term YAML %} files, please ensure you use
all required parameters as listed below.
{% configuration %}
@ -37,10 +36,6 @@ name:
description: Friendly name of the scene.
required: true
type: string
description:
description: Description of the scene.
required: true
type: string
entities:
description: Entities to control and their desired state.
required: true

View File

@ -78,5 +78,5 @@ For example:
```
{% note %}
Any comments in the YAML file will be lost and templates will be reformatted when you update a scene via the editor.
Any comments in the {% term YAML %} file will be lost and templates will be reformatted when you update a scene via the editor.
{% endnote %}

View File

@ -62,7 +62,7 @@ The variables {% term action %} allows you to set/override variables that will b
```yaml
- alias: "Set variables"
variables:
entities:
entities:
- light.kitchen
- light.living_room
brightness: 100
@ -94,9 +94,7 @@ Variables can be templated.
### Scope of variables
Variables have local scope. This means that if a variable is changed in a nested sequence block, that change will not be visible in an outer sequence block.
Inside the `if` sequence the `variables` {% term action %} will only alter the `people` variable for that sequence.
The `variables` {% term action %} assigns the values to previously defined variables with the same name. If a variable was not previously defined, it is assigned in the top-level (script run) scope.
{% raw %}
@ -111,17 +109,17 @@ sequence:
entity_id: device_tracker.paulus
state: "home"
then:
# At this scope and this point of the sequence, people == 0
- variables:
people: "{{ people + 1 }}"
# At this scope, people will now be 1 ...
paulus_home: true
- action: notify.notify
data:
message: "There are {{ people }} people home" # "There are 1 people home"
# ... but at this scope it will still be 0
# Variable value is now updated
- action: notify.notify
data:
message: "There are {{ people }} people home" # "There are 0 people home"
message: "There are {{ people }} people home {% if paulus_home is defined %}(including Paulus){% endif %}"
# "There are 1 people home (including Paulus)"
```
{% endraw %}
@ -213,8 +211,8 @@ This {% term action %} evaluates the template, and if true, the script will cont
The template is re-evaluated whenever an entity ID that it references changes state. If you use non-deterministic functions like `now()` in the template it will not be continuously re-evaluated, but only when an entity ID that is referenced is changed. If you need to periodically re-evaluate the template, reference a sensor from the [Time and Date](/integrations/time_date/) integration that will update minutely or daily.
{% raw %}
```yaml
```yaml
# Wait until media player is stopped
- alias: "Wait until media player is stopped"
wait_template: "{{ is_state('media_player.floor', 'stop') }}"
@ -258,8 +256,8 @@ With both types of waits it is possible to set a timeout after which the script
You can also get the script to abort after the timeout by using optional `continue_on_timeout: false`.
{% raw %}
```yaml
```yaml
# Wait for IFTTT event or abort after specified timeout.
- wait_for_trigger:
- trigger: event
@ -281,9 +279,9 @@ After each time a wait completes, either because the condition was met, the even
| Variable | Description |
| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `wait.completed` | Exists only after `wait_template`. `true` if the condition was met, `false` otherwise |
| `wait.trigger` | Exists only after `wait_for_trigger`. Contains information about which trigger fired. (See [Available-Trigger-Data](/docs/automation/templating/#available-trigger-data).) Will be `none` if no trigger happened before timeout expired |
| `wait.completed` | `true` if the condition was met, `false` otherwise |
| `wait.remaining` | Timeout remaining, or `none` if a timeout was not specified |
| `wait.trigger` | Exists only after `wait_for_trigger`. Contains information about which trigger fired. (See [Available-Trigger-Data](/docs/automation/templating/#available-trigger-data).) Will be `none` if no trigger happened before timeout expired |
This can be used to take different actions based on whether or not the condition was met, or to use more than one wait sequentially while implementing a single timeout overall.
@ -322,6 +320,7 @@ This can be used to take different actions based on whether or not the condition
target:
entity_id: switch.some_light
```
{% endraw %}
## Fire an event
@ -453,7 +452,7 @@ repeat:
{% endraw %}
Other types are accepted as list items, for example, each item can be a
template, or even an mapping of key/value pairs.
template, or even an mapping of key/value pairs.
{% raw %}
@ -509,7 +508,7 @@ For example:
- repeat:
while: "{{ is_state('sensor.mode', 'Home') and repeat.index < 10 }}"
sequence:
- ...
- ...
```
{% endraw %}
@ -559,8 +558,9 @@ For example:
- repeat:
until: "{{ is_state('device_tracker.iphone', 'home') }}"
sequence:
- ...
- ...
```
{% endraw %}
### Repeat loop variable
@ -576,9 +576,8 @@ It contains the following fields:
## If-then
This {% term action %} allow you to conditionally (`if`) run a sequence of actions (`then`)
and optionally supports running other sequence when the condition didn't
pass (`else`).
This {% term action %} allows you to conditionally (`if`), based on or more [conditions](/docs/scripts/conditions/) (which are `and` combined),
run a sequence of actions (`then`) and optionally supports running other sequence when the condition didn't pass (`else`).
```yaml
script:
@ -692,7 +691,6 @@ automation:
{% endraw %}
More `choose` can be used together. This is the case of an IF-IF.
The following example shows how a single {% term automation %} can control entities that aren't related to each other but have in common the same trigger.
@ -857,8 +855,8 @@ Some of the caveats of running {% term actions %} in parallel:
there is no guarantee that they will be completed in the same order.
- If one {% term action %} fails or errors, the other {% term actions %} will keep running until
they too have finished or errored.
- Variables created/modified in one parallelized {% term action %} are not available
in another parallelized {% term action %}. Each step in a parallelized has its own scope.
- Variables created/modified in one parallelized {% term action %} can conflict with variables
from another parallelized {% term action %}. Make sure to give them distinct names to prevent that.
## Stopping a script sequence
@ -962,7 +960,7 @@ blueprint:
input:
input_boolean:
name: Boolean
selector:
selector:
boolean:
actions:

View File

@ -560,7 +560,7 @@ Time condition windows can span across the midnight threshold if **both** `after
A better weekday condition could be by using the [Workday Binary Sensor](/integrations/workday/).
{% endtip %}
For the `after` and `before` options a time helper (`input_datetime` entity)
For the `after` and `before` options a time helper (`input_datetime` entity), a `time` entity,
or another `sensor` entity containing a timestamp with the "timestamp" device
class, can be used instead.
@ -571,6 +571,9 @@ conditions:
after: input_datetime.house_silent_hours_start
before: input_datetime.house_silent_hours_end
- alias: "Example referencing a time entity"
before: time.dnd_start
- alias: "Example referencing another sensor"
after: sensor.groceries_delivery_time
```

View File

@ -149,7 +149,7 @@ Another use of the {% my developer_statistics title="statistics developer tool"
<svg width="24" height="24" viewBox="0 0 24 24"><path d="M22,13V22H2V19L22,13M21.68,7.06L16.86,4.46L17.7,7.24L7.58,10.24C6.63,8.95 4.82,8.67 3.53,9.62C2.24,10.57 1.96,12.38 2.91,13.67C3.85,14.97 5.67,15.24 6.96,14.29C7.67,13.78 8.1,12.97 8.14,12.09L18.26,9.09L19.1,11.87L21.68,7.06Z" /></svg>
icon. Use date & time to search for the incorrect data point and adjust the value.
![Screenshot showing adjusting the long-term statistic history value](/images/blog/2022-04/adjust-statistics.png)
![Screenshot showing adjusting the long-term statistic history value](/images/docs/developer-tools/adjust-statistics.png)
## Assist tab

View File

@ -5,8 +5,9 @@ description: "Description of hass."
The command-line part of Home Assistant is `hass`.
This tool is only available to users of the Home Assistant Core installation method. It is started from the command line on the computer running Home Assistant Core (accessed perhaps via SSH).
```bash
```text
$ hass -h
usage: hass [-h] [--version] [-c path_to_config_dir] [--safe-mode]
[--debug] [--open-ui] [--skip-pip] [-v] [--log-rotate-days LOG_ROTATE_DAYS]

View File

@ -18,9 +18,11 @@ Type these from anywhere in the application to launch the dialog.
| Mode | Hotkey | Switch Modes
| ------------- | ------------- | ------------- |
| Entity Filter | `e` | Type `>` at start of input to switch to command palette.
| Entity Filter | `e` | Type `>` at start of input to switch to command palette. Type `#` at start of input to switch to device filter.
| Command Palette | `c` | Remove `>` from start of input to switch to entity filter.
| Device Filter | `d` | 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.
| Assist | `a` | Open the Home Assistant Assist dialog.
{% 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.
@ -41,6 +43,17 @@ Once launched, start typing your entity id (or ["bits and pieces" of your entity
This is helpful when, say, you are in the middle of writing an automation and need some quick insight about an entity but don't want to navigate away to Developer Tools.
## Device filter
*Hotkey: `d`*
Similar to {% my entities title="Settings -> Devices & Services -> Devices" %}, but accessible from anywhere in the frontend.
Once launched, start typing your device name to get back a filtered list of your devices. Clicking on a device (or hitting `enter` when the desired device is highlighted) will open the selected device detail page.
This is helpful when you need to quickly access a device's detail page without navigating your way through the menu.
## Command palette
*Hotkey: `c`*
@ -66,6 +79,15 @@ Type | Available |
Create [`my`](/integrations/my) links from any supported page in the user interface, when invoked on a supported page it will open a new tab that will allow you to share the link in different formats.
## Assist
*Hotkey: `a`*
Opens the Assist dialog to interact with Home Assistant using your voice or by text.
This feature is only available if you have set up a voice assistant.
Learn more about [voice assistants](/voice_control).
## Disabling shortcuts
You can enable or disable all of Home Assistant's keyboard shortcuts by going to your User Profile and clicking the "Keyboard Shortcuts" toggle button.

View File

@ -30,7 +30,7 @@ Recovery mode loads a minimum set of integrations to allow troubleshooting the c
### Resolution
You need to identify the issue in the configuration files and fix it there. The issue could be caused by something as simple as an invalid YAML file.
You need to identify the issue in the configuration files and fix it there. The issue could be caused by something as simple as an invalid {% term YAML %} file.
- If you are running {% term "Home Assistant Operating System" %}, you can install an add-on such as Studio Code Server to edit the configuration file if needed.
- If you are still logged in, you can [edit your configuration](/docs/configuration/#editing-configurationyaml).

View File

@ -12,13 +12,14 @@ You need to have a compatible Z-Wave stick or module installed. The following de
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:
- 700 series:
- prefer SDK versions 7.17.2 to 7.18.x
- prefer SDK versions 7.17.2 to 7.18.x or 7.21.6 and newer
- SDK versions 7.19.x are okay
- avoid SDK versions before 7.17.2
- avoid SDK versions 7.20 to 7.21.3
- avoid SDK versions 7.20 to 7.21.5
- 800 series
- prefer SDK versions 7.22.x
- prefer SDK versions 7.23.x and newer
- SDK versions 7.22.x are okay
- 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
@ -41,16 +42,16 @@ Firmware can be upgraded using the below directions:
{% endwarning %}
- 800 series controllers (with some caveats, see notes)
- 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)
- Silicon Labs UZB-7 USB Stick (Silabs SLUSB7000A / SLUSB001A)
- Zooz S2 Stick 700 (ZST10 700)
- HomeSeer SmartStick+ G3
- HomeSeer Z-NET G3
- Silicon Labs UZB-7 USB Stick (Silabs SLUSB7000A / SLUSB001A)
- Zooz S2 Stick 700 (ZST10 700)
- Z-Wave.Me Z-Station
- 500 series controllers
- Aeotec Z-Stick Gen5 (see note below)

View File

@ -2,11 +2,11 @@
<div class='section'>
<h1 class="title epsilon">Common tasks</h1>
<ul class='divided sidebar-menu'>
<li>{% active_link /common-tasks/general/ Installation independent %}</li>
<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>
</ul>
</div>
</section>

View File

@ -3,7 +3,7 @@
{% assign percentage = 100.0 | times: active_installations | divided_by: site.data.analytics_data.reports_integrations | round: 1 %}
<section class="aside-module grid__item one-whole lap-one-half">
<div class='brand-logo-container section'>
<img src='https://brands.home-assistant.io/{% if page.ha_brand %}brands{% else %}_{% endif %}/{{ domain }}/logo.png' srcset='https://brands.home-assistant.io/{% if page.ha_brand %}brands{% else %}_{% endif %}/{{ page.ha_domain }}/logo@2x.png 2x' />
<img src='https://brands.home-assistant.io/{% if page.ha_brand %}brands{% else %}_{% endif %}/{{ page.ha_domain }}//logo.png' srcset='https://brands.home-assistant.io/{% if page.ha_brand %}brands{% else %}_{% endif %}/{{ page.ha_domain }}/logo@2x.png 2x' />
{%- if page.ha_config_flow and domain -%}
{% my config_flow_start badge domain=domain %}
@ -30,7 +30,7 @@
{%- if page.ha_brand -%}
The {{ page.title | default: page.name }} brand was introduced in Home Assistant {{ page.ha_release | default: "unknown" }}.
{%- else -%}
The {{ page.title | default: page.name }} {{ page.ha_integration_type | default: "integration" }} was introduced in Home Assistant {{ page.ha_release | default: "unknown" }}
The {{ page.title | default: page.name }} {% if page.ha_integration_type == "virtual" %} virtual integration {% else %} {{ page.ha_integration_type | default: "integration" }} {% endif %} was introduced in Home Assistant {{ page.ha_release | default: "unknown" }}
{%- if page.ha_iot_standard or page.ha_integration_type == "entity" -%}
.
@ -58,11 +58,13 @@
{%- 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>
{% if page.ha_quality_scale == "bronze" %}<a href='/docs/quality_scale/#-bronze'>🥉 Bronze quality</a><br />{%- endif -%}
{% if page.ha_quality_scale == "silver" %}<a href='/docs/quality_scale/#-silver'>🥈 Silver quality</a><br />{%- endif -%}
{% if page.ha_quality_scale == "gold" %}<a href='/docs/quality_scale/#-gold'>🥇 Gold quality</a><br />{%- endif -%}
{% if page.ha_quality_scale == "platinum" %}<a href='/docs/quality_scale/#-platinum'>🏆 Platinum quality</a><br />{%- endif -%}
{% if page.ha_quality_scale == "internal" %}<a href='/docs/quality_scale/#-internal'>🏠 Internal integration</a><br />{%- endif -%}
{% if page.ha_quality_scale == "legacy" %}<a href='/docs/quality_scale/#-legacy'>💾 Legacy integration</a><br />{%- endif -%}
{% if page.ha_quality_scale == "custom" %}<a href='/docs/quality_scale/#-custom'>📦 Custom integration</a><br />{%- endif -%}
</div>
{%- endif -%}

View File

@ -112,41 +112,46 @@
{% 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
<li>{% icon "mdi:comment-processing-outline" %} {% active_link /voice_control/ Assist up and running %}
<ul>
<li>{% active_link /voice_control/voice_remote_local_assistant/ Getting started - Local %}</li>
<li>{% active_link /voice_control/voice_remote_cloud_assistant/ Getting started - Home Assistant Cloud %}</li>
</ul>
</li>
<li>{% icon "mdi:comment-processing-outline" %} {% active_link /voice_control/best_practices Best practices %}
<ul>
<li>{% active_link /voice_control/voice_remote_expose_devices/ Exposing entities to Assist %}</li>
<li>{% active_link /voice_control/assign_areas_floors/ Assigning devices to areas and areas to floors %}</li>
<li>{% active_link /voice_control/aliases/ Aliases for entities, areas and floors %}</li>
<li>{% active_link /voice_control/builtin_sentences/ Talking to Assist - Sentences starter pack %}</li>
</ul>
</li>
<li>{% icon "mdi:comment-processing-outline" %} {% active_link /voice_control/expanding_assist Expanding Assist %}
<ul>
<li>{% active_link /voice_control/assist_create_open_ai_personality/ Creating a personality with AI %}</li>
<li>{% active_link /voice_control/custom_sentences/ Custom sentences %}</li>
<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
<li>{% icon "mdi:checkbox-marked" %} Experiment with Assist setups
<ul>
<li>{% active_link /voice_control/about_wake_word/ The Home Assistant Approach to Wake Words %}</li>
<li>{% active_link /voice_control/create_wake_word/ Wake words for Assist %}</li>
<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>
<li>{% active_link /voice_control/start_assist_from_dashboard/ Starting Assist from your dashboard %}</li>
<li>{% active_link /voice_control/contribute-voice/ Contribute to the Voice initiative %}</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>
<li>{% active_link /voice_control/using_tts_in_automation/ Using Piper TTS in automations %}</li>
</ul>
</li>
</ul>
@ -181,14 +186,14 @@
</li>
<li>
{% icon "mdi:update" %} {% active_link /common-tasks/os/ Common tasks %}
{% icon "mdi:update" %} {% active_link /common-tasks/general/ Common tasks %}
{% if root == 'common-tasks' or include.docs_index %}
<ul>
<li>{% active_link /common-tasks/general/ Installation independent %}</li>
<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 %}
@ -208,7 +213,7 @@
<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/state_object/ State and state object %}</li>
<li>{% active_link /docs/configuration/entities_domains/ Entities and domains %}</li>
<li>{% active_link /docs/configuration/templating/ Templating %}</li>
<li>{% active_link /docs/configuration/platform_options/ Entity component platform options %}</li>
@ -274,5 +279,6 @@
<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>
<li><a href="https://voice-pe.home-assistant.io/">Home Assistant Voice Preview Edition {% icon "tabler:external-link" %}</a></li>
</ul>
</li>

View File

@ -1,38 +1,42 @@
<section class="aside-module grid__item one-whole lap-one-half">
<div class="section">
<h1 class="title epsilon"><iconify-icon icon="mdi:devices"></iconify-icon> Devices</h1>
<h1 class="title epsilon">{% icon "mdi:comment-processing-outline" %} {% active_link /voice_control/ Assist up and running %}</h1>
<ul class="divided sidebar-menu">
<li>{% active_link /voice_control/voice_remote_local_assistant/ Getting started - Local %}</li>
<li>{% active_link /voice_control/voice_remote_cloud_assistant/ Getting started - Home Assistant Cloud %}</li>
</ul>
</div>
<div class="section">
<h1 class="title epsilon"><iconify-icon icon="mdi:devices">{% icon "mdi:comment-processing-outline" %} {% active_link /voice_control/best_practices Best Practices %}</h1>
<ul class="divided sidebar-menu">
<li>{% active_link /voice_control/voice_remote_expose_devices/ Exposing entities to Assist %}</li>
<li>{% active_link /voice_control/assign_areas_floors/ Assigning devices to areas and areas to floors %}</li>
<li>{% active_link /voice_control/aliases/ Aliases for entities, areas and floors %}</li>
<li>{% active_link /voice_control/builtin_sentences/ Talking to Assist - Sentences starter pack %}</li>
</ul>
</div>
<div class="section">
<h1 class="title epsilon"><iconify-icon icon="mdi:devices">{% icon "mdi:comment-processing-outline" %} {% active_link /voice_control/expanding_assist Expanding Assist %}</h1>
<ul class="divided sidebar-menu">
<li>{% active_link /voice_control/assist_create_open_ai_personality/ Creating a personality with AI %}</li>
<li>{% active_link /voice_control/custom_sentences/ Custom sentences %}</li>
<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>
</div>
<div class="section">
<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>
<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>
</div>
<div class="section">
<h1 class="title epsilon">{% icon "mdi:checkbox-marked" %} Projects</h1>
<h1 class="title epsilon">{% icon "mdi:checkbox-marked" %} Experiment with Assist setups</h1>
<ul class="divided sidebar-menu">
<li>{% active_link /voice_control/about_wake_word/ The Home Assistant Approach to Wake Words %}</li>
<li>{% active_link /voice_control/create_wake_word/ Wake words for Assist %}</li>
<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>
<li>{% active_link /voice_control/start_assist_from_dashboard/ Starting Assist from your dashboard %}</li>
<li>{% active_link /voice_control/contribute-voice/ Contribute to the Voice initiative %}</li>
</ul>
</div>
<div class="section">
@ -40,6 +44,7 @@
<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>
<li>{% active_link /voice_control/using_tts_in_automation/ Using Piper TTS in automations %}</li>
</ul>
</div>
</section>

View File

@ -1,8 +1,8 @@
## Backups
Backup of your Home Assistant, add-on data, and configuration. Backups are used to [restore](#restoring-a-backup) a system or parts of it if a rollback is needed or to migrate your Home Assistant to new hardware. It is good practice to create a backup before updating.
It is important to regularly back up your Home Assistant setup. You may have spent many hours configuring your system and creating automations. Keep your configurations safe so that you can [restore](#restoring-a-backup) a system or migrate your Home Assistant to new hardware.
Backups are made from the backups panel under {% my supervisor_backups title="**Settings** > **System** > **Backups**" %}. There is also an [action](/integrations/hassio/#action-hassiobackup_full) available that allows you to trigger the creation of a backup from an automation. Backups are stored in a compressed archive file (.tar) and by default, stored locally in the `/backup` directory.
Backups are encrypted and stored in a compressed archive file (.tar) and by default, stored locally in the `/backup` directory.
A full backup includes the following directories:
@ -16,65 +16,142 @@ A partial backup consists of any number of the above default directories and ins
### Preparing for a backup
1. Before creating a backup, check if you can reduce the size of the backup.
- Check if your configuration directory contains a large database file. Go to **{% my system_health title="Settings > System > Repairs" %}**. From the three dot menu, select **System information** and under the **Recorder** section, look for the **Estimated Database Size (MiB)**.
Before creating a backup, check if you can reduce the size of the backup. This is especially important if you want to use the backup to migrate the system to new hardware, for example from a Raspberry Pi Compute Module&nbsp;4 to a Raspberry Pi Compute Module&nbsp;5.
1. Check if your configuration directory contains a large database file:
- Go to {% my system_health title="**Settings** > **System** > **Repairs**" %}.
- From the three dots {% icon "mdi:dots-vertical" %} menu, select **System information** and under the **Recorder** section, look for the **Estimated Database Size (MiB)**.
- By default, the data is kept for 10 days. If you have modified that to a longer period, check the [`recorder`](/integrations/recorder/) integration page for options to keep your database data down to a size that won't cause issues.
- Note the keep days, purge interval, and include/exclude options.
2. To check how much space you've used in total, go to {% my system_health title="**Settings** > **System** > **Repairs**" %}.
- From the three dots {% icon "mdi:dots-vertical" %} menu, select **System information**, and check under **Home Assistant Supervisor** > **Disk used**.
- If you have add-ons installed that you no longer use, uninstall those add-ons. Some add-ons require quite a bit of space.
2. Old backups are not included in the backup. However, while you are here, you could delete all old and unneeded backups.
3. If you want to store the backup on your network storage instead of just locally on your system, follow the steps on [adding a new network storage](/common-tasks/os/#add-a-new-network-storage) and select the **Backup** option.
### Making a backup from the UI
### Setting up an automatic backup process
1. Go to {% my supervisor_backups title="**Settings** > **System** > **Backups**" %} in the UI.
2. Select the **Create backup** button in the lower right.
3. Provide a name for the backup.
4. Choose **Full backup** or **Partial backup**.
- If you choose **Partial backup**, make sure to select Home Assistant and all the folders and add-ons you want to backup or migrate.
- Note that the number of add-ons increases the size of the backup as well as the time it takes to restore from that backup.
5. Optionally, enable password protection.
6. Select **Create** to begin the backup.
The automatic backup process creates a backup on a predefined schedule and also deletes old, redundant backups.
### Alternative: Creating a backup using the Home Assistant Command Line Interface
1. Go to {% my supervisor_backups title="**Settings** > **System** > **Backups**" %}.
2. Under **Set up backups**, select **Set up backups**.
3. Download the emergency kit and store it somewhere safe.
- You need it to restore encrypted backups.
- To learn more about backup encryption, refer to the documentation on the [backup emergency kit](/more-info/backup-emergency-kit/).
4. Define the backup schedule.
- It is recommended to back up **Daily**, but you can also choose to back up on specific days.
- Define the time:
- **System optimal** sets a time in a predefined time window as shown in the UI.
- **Custom** lets you pick the time when you want the backup to start.
- Make sure you pick a time when all your backup locations are up and running and available. Otherwise, the backup will fail for locations which are not available.
5. Define how many backups you want to keep.
- Older backups will be automatically deleted.
- For example: if you back up daily, and select 7 backups, then the backup from 8 days ago and older will be deleted.
6. Define the data you want to back up.
- It is recommended to disable media and the shared folder to reduce the size of the backup.
- A large backup also takes longer to restore.
- Some add-ons may also be quite large.
7. [Define the location for backups](#defining-backup-locations).
1. `ha backups list` - lists backups and their slugnames
2. `ha backups restore slugname` - restores a specific backup
3. `ha backups new --name nameofbackup` - create a backup
### Defining backup locations
For additional information about command line usage, use the `ha help` command or refer to the [Home Assistant Command Line documentation](/common-tasks/os/#home-assistant-via-the-command-line).
You might need a backup in case your system has crashed. If you only store backups on the device itself, you won't be able to access them easily. It is recommended to keep a copy on another system (outside of Home Assistant) and ideally also one off-site.
### Copying your backups to another location
{% note %}
You will find an overview of integrations which provide a backup location [here](/integrations/#backup).
{% endnote %}
You might need a backup in case your system has crashed. If you only store them on the device itself, you won't be able to access them easily. We recommend that you copy them from `/backup` to another machine on occasion.
#### About the backup storage on Home Assistant Cloud
There are multiple ways to store the backup on another device:
If you have Home Assistant Cloud, you can store a backup of maximum 5&nbsp;GB on Home Assistant Cloud. This cloud storage space is available for all existing and new Home Assistant Cloud subscribers without additional cost. It stores one backup file: the backup that was last saved to Home Assistant Cloud. These backups are always encrypted. To restore encrypted backups, you need the encryption key stored in the [backup emergency kit](/more-info/backup-emergency-kit/).
- **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 {% 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).
- In your file explorer, access Home Assistant, open the `backup` folder and copy the file to your computer.
- **Option 3**: You can also change the default location for backups:
- [Add a network storage location](/common-tasks/{{page.installation}}/#network-storage) for backups.
- [Change the default location](/common-tasks/{{page.installation}}/#change-default-backup-location) for backups.
#### To define the backup location for automatic backups
- **Option 4**: Or even better, create an automation to handle that, using one of the [backup actions](/integrations/hassio/#action-hassiobackup_full).
- **Option 5**: Make use of a third-party add-on:
- [Google Drive Backup](https://github.com/sabeechen/hassio-google-drive-backup)
- [Dropbox Sync](https://github.com/danielwelch/hassio-dropbox-sync)
- [OneDrive Backup](https://github.com/lavinir/hassio-onedrive-backup)
- [Nextcloud Backup](https://github.com/Sebclem/hassio-nextcloud-backup)
- [Remote Backup (scp/rsync/rclone)](https://github.com/ikifar2012/remote-backup-addon)
- [Samba backup](https://github.com/thomasmauerer/hassio-addons/tree/master/samba-backup)
- [Syncthing](https://github.com/Poeschl/Hassio-Addons/tree/main/syncthing)
1. Go to {% my supervisor_backups title="**Settings** > **System** > **Backups**" %} and under **Automatic backups**, select **Configure automatic backups**.
2. Under **Locations**, use the toggle to enable all the backup locations you want to use.
- If you don't see Home Assistant Cloud in the list, you are not [logged in](https://www.nabucasa.com/config/).
- If you want to back up to your NAS (such as [Synology](/integrations/synology_dsm/#backup-location)) or a cloud provider (such as [Google Drive](/integrations/google_drive/) or [Microsoft OneDrive](/integrations/onedrive/)), check their integration documentation for specific instructions on setting up a Home Assistant backup.
- If you don't see a network storage, you haven't added one. Follow the steps on [adding a new network storage](/common-tasks/os/#add-a-new-network-storage) and select the **Backup** option.
![Define the backup locations](/images/screenshots/network-storage/backup_locations_encryption.png)
3. For each enabled location, select the cog {% icon "mdi:cog-outline" %} to enable/disable encryption.
- **Info**: The backup stored on Home Assistant Cloud is always encrypted.
### Creating a backup automation using the backup action
If the backup automation settings provided in the UI do not match your use case, you can manually configure your own backup automation using the [backup.create_automatic](/integrations/backup/#action-backupcreate_automatic) action.
Using the {% my developer_call_service service="backup.create_automatic" %} action in your own automation allows you to create automated backups on any schedule you like, or even add conditions and actions around it. For example, you could make an automation that triggers on a calendar, turns on your NAS, waits until it is online, and then triggers a backup.
### Creating a manual backup
This creates a backup instantly. You can create a manual backup at any time, irrespective of any automatic backups you may have defined.
1. Go to {% my supervisor_backups title="**Settings** > **System** > **Backups**" %}.
2. In the lower-right corner, select **Backup now** and select **Manual backup**.
3. Define the data you want to back up.
- It is recommended to disable media and the share folder to reduce the size of the backup.
- A large backup also takes longer to restore.
- Some add-ons may also be quite large.
4. Provide a name for the backup.
5. Choose the backup locations.
- To learn more about the locations, refer to the section on [defining the backup location](#defining-backup-locations).
6. Download the [backup emergency kit](/more-info/backup-emergency-kit/) and store it somewhere safe. Make sure you take note of the backup name it belongs to.
7. To start the backup process, select **Create backup**.
### Downloading your local backups
When downloading the backup from the Home Assistant backup page, it is decrypted on the fly so that you can view the data using your favorite archive tool. This is done for all backup locations and also when you download from Home Assistant Cloud.
There are multiple ways to download your local backup from your Home Assistant instance and store it on another device:
**Option 1**: Download from the backup page:
1. Under {% my supervisor_backups title="**Settings** > **System** > **Backups**" %}, select **Show all backups**.
2. To select multiple backups, select the {% icon "mdi:order-checkbox-ascending" %} button.
3. 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.
4. If a backup is stored on multiple locations, you can select where you download it from:
- Select the backup, and under **Locations**, select the three dots {% icon "mdi:dots-vertical" %} and select **Download from this location**.
**Option 2**: Copy backups from the backups folder:
1. 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).
2. In your file explorer, access Home Assistant, open the `backup` folder and copy the file to your computer.
### Downloading a backup from Home Assistant Cloud
If you were logged in to Home Assistant Cloud and had Cloud backup enabled when creating a backup, your last backup is stored on Home Assistant Cloud.
There are two ways to download the backup from Home Assistant Cloud:
- **Option 1**: From the backups page
1. Got to {% my supervisor_backups title="**Settings** > **System** > **Backups**" %} and select **Show all backups**.
2. Under **Stored files**, you can see the latest available backup file. Select the download button.
- **Option 2**: From your Home Assistant Cloud account
1. Log in to your [Home Assistant Cloud account](https://account.nabucasa.com/).
2. Select the backup from the list.
3. Under **Locations**, select the three dots {% icon "mdi:dots-vertical" %} and select **Download from this location**.
### Deleting obsolete backups
If you defined an automatic backup and backup purge schedule, old backups are deleted automatically. However, you might still have some old backups around that you want to delete.
To delete old backups, follow these steps:
1. Under {% my supervisor_backups title="**Settings** > **System** > **Backups**" %}, select **Show all backups**.
2. To delete one backup, on the list, select the backup of interest.
- Select the three dots {% icon "mdi:dots-vertical" %} menu and select **Delete**.
3. To delete multiple backups, select the {% icon "mdi:order-checkbox-ascending" %} button.
- From the list of backups, select all the ones you want to delete and select **Delete selected**.
- {% icon "mdi:information-outline" %} Consider keeping at least one recent backup for recovery purposes.
### Restoring a backup
There are two ways to use a backup:
- On your current system to recover your settings.
- During onboarding, to migrate your setup to a new device or a to device on which you performed a factory reset and a new installation.
- During onboarding, to migrate your setup to a new device or to device on which you performed a factory reset.
#### Estimated duration
@ -90,16 +167,17 @@ You can use a backup during the onboarding process to restore your configuration
- This procedure assumes you have already completed the [installation](/installation/) procedure on your target device and are now viewing the welcome screen as part of the [onboarding](/getting-started/onboarding/).
- The login credentials of the device from which you made the backup.
- The [backup emergency kit](/more-info/backup-emergency-kit/) that contains the key needed to decrypt the backup.
- **Required storage capacity**: If you migrate the installation to a new device, make sure the new device has more storage capacity than the existing device.
- Before migrating, on the old system, check how much storage you used.
- Go to **{% my system_health title="Settings > System > Repairs -> ... -> System Information" %}**, and under **Home Assistant Supervisor**, look at the **Disk used** value.
- The target device must have more free space than the source device.
- If your target device is a Home Assistant Yellow, note that it is the size of the eMMC that is relevant.
- The restore process mainly uses the eMMC, not the NVMe.
- The size of the backup file is no indication of the size of your installation. To know the size of your installation, you need to check the **Disk used** value mentioned above.
- Before migrating, on the old system, check how much storage you used.
- Go to **{% my system_health title="Settings > System > Repairs > ... > System Information" %}**, and under **Home Assistant Supervisor**, look at the **Disk used** value.
- The target device must have more free space than the source device.
- If your target device is a Home Assistant Yellow, note that it is the size of the eMMC that is relevant.
- The restore process mainly uses the eMMC, not the NVMe.
- The size of the backup file is no indication of the size of your installation. To know the size of your installation, you need to check the **Disk used** value mentioned above.
- If you are migrating to a new device:
- You do not need to transfer the backup to a USB or SD card to bring it to your device.
- You will be able to upload the backup file from the device you are accessing the onboarding from.
- You do not need to transfer the backup to a USB or SD card to bring it to your device.
- You will be able to upload the backup file from the device you are accessing the onboarding from.
##### To restore a backup during onboarding
@ -109,25 +187,32 @@ You can use a backup during the onboarding process to restore your configuration
- Then, select **Upload backup**.
- The file explorer opens on the device on which you are viewing the Home Assistant User interface.
- You can access any connected network drive from there.
3. Select the backup file, then, in the dialog, select **Full backup** and **Restore**.
3. Select the backup file, then, in the dialog, select all parts you want to restore.
- Your current system will be overwritten with the parts that you choose to restore.
- If you want to restore the complete configuration with all directories and add-ons, select everything.
4. Under **Backup password**, enter the encryption key stored in the [backup emergency kit](/more-info/backup-emergency-kit/).
5. To start the process, select **Restore**.
- The restore may take a while, depending on the amount of data.
- To see if the restore is complete, reload the page from time to time.
- If your previous installation had certificates enabled directly for the [`http` integration](/integrations/http), when the restore is complete, it will no longer respond to `http://` requests. In this case, use `https://` (added `s`) instead.
4. On the login screen, enter the credentials of the system from which you took the backup.
6. On the login screen, enter the credentials of the system from which you took the backup.
- The login password and username must match the ones you used at the time the backup was taken.
- Your dashboard should show all the elements as they were when you created the backup.
- If some devices are shown as unavailable, you may need to wake the battery powered devices.
5. If you had [network storage](/common-tasks/os/#network-storage) connected on the previous system, you may need to reconnect those.
6. If you had Zigbee devices, and you migrated to a new device with its own Zigbee radio built-in:
- If some devices are shown as unavailable, you may need to wake the battery-powered devices.
7. If you had [network storage](/common-tasks/os/#network-storage) connected on the previous system, you may need to reconnect those.
8. If you had Zigbee devices, and you migrated to a new device with its own Zigbee radio built-in:
- Because this is now a different Zigbee radio, you need to [migrate Zigbee](/integrations/zha/#migrating-to-a-new-zigbee-coordinator-adapter-inside-zha).
#### To restore a backup on your current system
1. Go to **{% my backup title="Settings > System > Backups" %}**.
2. From the list of backups, select the backup from which you want to restore.
3. If you want to restore the complete configuration with all directories and add-ons, select **Full backup**.
4. If you only want to restore specific elements, select **Partial backup**.
- From the list, select the installation, folders, and add-ons you want to restore.
5. Select **Restore**.
- This may take a while, depending on how much you have to compress or decompress.
6. Once the restore is complete, Home Assistant restarts to apply the new settings.
3. Select what to restore:
- Your current system will be overwritten with the parts that you choose to restore.
- If you want to restore the complete configuration with all directories and add-ons, select everything.
- If you only want to restore specific elements, only select the folders and add-ons you want to restore.
4. Select **Restore**.
- This may take a while, depending on how much there is to compress or decompress.
5. Once the restore is complete, Home Assistant restarts to apply the new settings.
- You will lose the connection to the UI and it will return once the restart is completed.
6. On the login screen, enter the password and username as they were at the time the backup was taken.

View File

@ -101,7 +101,7 @@ Use "ha [command] --help" for more information about a command.
You can also access the {% term "Home Assistant Operating System" %} via a directly connected keyboard and monitor, the console.
#### Wiping the data disk wipe from the command line
#### Wiping the data disk from the command line
In {% term "Home Assistant Operating System" %}, the `ha os datadisk wipe` command wipes the data disk. The command deletes all user data as well as Home Assistant Core, Supervisor, and any installed add-ons.
@ -109,7 +109,12 @@ The command `ha os datadisk wipe` marks the data partition (either internal on t
The `ha os datadisk wipe` command can only be run from the local terminal. Connect a display and keyboard and use the terminal.
Note, if you have a Home Assistant Yellow, there is a red hardware button to wipe the data disk. Follow the procedure on [resetting the device](https://yellow.home-assistant.io/guides/factory-reset/).
Note, some systems have a reset button you can use to clear the data disk, instead of using the command line:
- If you have a Home Assistant Yellow with a Raspberry Pi Compute Module 5, use the command line steps described above.
- If you have a Home Assistant Yellow with a Raspberry Pi Compute Module 4, there is a red hardware button to wipe the data disk. Follow the procedure on [resetting the Home Assistant Yellow](https://yellow.home-assistant.io/guides/factory-reset/).
- If you have a Home Assistant Green, there is a black hardware button to wipe the data disk. Follow the procedure on [resetting the Home Assistant Green](https://green.home-assistant.io/guides/reset/).
#### Listing all users from the command line

View File

@ -9,12 +9,12 @@ After changing configuration or automation files, check if the configuration is
1. Go to {% my profile title="your user profile" %} and enable **Advanced Mode**.
2. Go to {% my server_controls title="**Developer tools** > **YAML**" %} and in the **Configuration validation** section, select the **Check configuration** button.
- This is to make sure there are no syntax errors before restarting Home Assistant.
- It checks for valid YAML and valid config structures.
- It checks for valid {% term YAML %} and valid config structures.
3. If you need to do a more comprehensive configuration check, [run the check from the CLI](#to-run-a-configuration-check-from-the-cli).
### Running a configuration check from the CLI
Use the following command to check if the configuration is valid. The command line configuration check validates the YAML files and checks for valid config structures, as well as some other elements.
Use the following command to check if the configuration is valid. The command line configuration check validates the {% term YAML %} files and checks for valid config structures, as well as some other elements.
```bash
ha core check

View File

@ -11,7 +11,7 @@ All data on the target disk will be overwritten!
{% endcaution %}
{% important %}
The storage ca pacity of the external data disk must be larger than the storage capacity of the existing (boot) disk.
The storage capacity of the external data disk must be larger than the storage capacity of the existing (boot) disk.
{% endimportant %}
{% important %}
@ -25,8 +25,7 @@ If you have been using a data disk previously with {% term "Home Assistant Opera
3. Select **Move data disk**.
4. Select the data disk from the list of available devices.
5. Select **Move**.
![Screenshot of the "Move datadisk" feature](/images/screenshots/move-datadisk.png)
- Depending on the amount of data, this may take a while.
### Using CLI to move the data partition
@ -66,7 +65,7 @@ This can be an option if the following elements apply to your use case:
- You have another, new, Home Assistant instance (system 2).
- 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.
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/general/#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.
#### Prerequisites
@ -77,7 +76,7 @@ The aim is to migrate the data from system 1 to system 2. One way to do this is
To migrate an external data disk from one system to another, follow these steps:
1. [Create a backup](/common-tasks/os/#backups) of both systems and store these backups on another system (not strictly necessary, but recommended just in case, at least for the important data).
1. [Create a backup](/common-tasks/general/#backups) of both systems and store these backups on another system (not strictly necessary, but recommended just in case, at least for the important data).
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.

View File

@ -54,10 +54,10 @@ You can enable I2C via this terminal:
```shell
mkdir /tmp/mnt
mount /dev/sda1 /tmp/mnt
mkdir -p /tmp/mnt/CONFIG/modules
echo -ne i2c-dev>/tmp/mnt/CONFIG/modules/rpi-i2c.conf
echo dtparam=i2c_vc=on >> /tmp/mnt/CONFIG/config.txt
echo dtparam=i2c_arm=on >> /tmp/mnt/CONFIG/config.txt
mkdir -p /tmp/mnt/modules
echo -ne i2c-dev>/tmp/mnt/modules/rpi-i2c.conf
echo dtparam=i2c_vc=on >> /tmp/mnt/config.txt
echo dtparam=i2c_arm=on >> /tmp/mnt/config.txt
sync
reboot
```

View File

@ -1,6 +1,6 @@
## Network storage
You can configure both Network File Share (NFS) and Windows samba (CIFS) targets to be used within Home Assistant and add-ons.
You can configure both Network File System (NFS) and Samba/Windows (CIFS) targets to be used within Home Assistant and add-ons.
To list all your currently connected network storages, go to **{% my storage title="Settings > System > Storage" %}** in the UI.
{% if page.installation == "os" %}
@ -56,7 +56,7 @@ Server:
"[NFS]<sup>1</sup> Remote share path":
description: The path used to connect to the remote storage server.
"[CIFS]<sup>2</sup> Username":
description: The username to use when connecting to the storage server.
description: "The username to use when connecting to the storage server. Use User Principal Name for domain accounts. For example: `user@domain.com`."
"[CIFS]<sup>2</sup> Password":
description: The password to use when connecting to the storage server.
"[CIFS]<sup>2</sup> Share":
@ -71,31 +71,21 @@ Server:
{% configuration_basic "hassio.network_share.usage" %}
Backup:
description: This will become a target. You can use it in service calls or when manually creating a backup. The first storage you add of this type becomes your new default target. If you want to change the default target, [check out the documentation below](#change-default-backup-location).
description: This will become a target. You can use it when creating an automatic or manual backup. The first storage you add of this type becomes your new default target. If you want to change the default target, [check out the documentation below](#change-default-local-backup-location).
Media:
description: A new directory with the name you gave your network storage will be created under `/media`. This directory can be accessed by Home Assistant and add-ons.
Share:
description: A new directory with the name you gave your network storage will be created under `/share`. This directory can be accessed by Home Assistant and add-ons.
{% endconfiguration_basic %}
### Change default backup location
### Change default local backup location
By default, the first network storage of type **Backup** that you add will be set as your default backup target.
By default, the first network storage of type **Backup** that you add is used as your local default backup location.
If you want to change the default backup target, you can do the following:
If you want to change the local network storage that is used to store your backups, follow these steps:
1. Go to **{% my backup title="Settings > System > Backups" %}** in the UI.
2. Select the menu in the top right of the screen and select the **Change default backup location** option.
3. In the dialog, there is a single option to set the default backup target.
4. Choose the one you want from the list.
5. Select **Save**.
This list will contain all the network storage targets you have added of usage type **Backup**. It also contains another option to set it back to use `/backup` again.
<p class='img'>
<picture>
<source srcset="/images/screenshots/network-storage/change_backup_dark.png" media="(prefers-color-scheme: dark)">
<img src="/images/screenshots/network-storage/change_backup_light.png">
</picture>
Screenshot of changing the default backup target.
</p>
1. Go to **{% my backup title="Settings > System > Backups" %}**.
2. In the top-right corner, select the three dots {% icon "mdi:dots-vertical" %} menu and select **Change local backup location**.
3. Select your preferred network location and save your changes.
![Select default location used for local backup](/images/screenshots/network-storage/backup_select_local_default.png)
4. **Troubleshooting**: Don't see your external storage location? This list contains only the network storage targets you have added of type **Backup**.

View File

@ -20,7 +20,7 @@ ha core update --version {{current_version}} --backup
_The_ `--backup` _flag here ensures that you have a partial backup of your current setup in case you need to downgrade later._
To downgrade your installation, do a [partial restore of a backup](/common-tasks/os/#backups) instead.
To downgrade your installation, do a [partial restore of a backup](/common-tasks/general/#backups) instead.
{% elsif page.installation == "container" %}

View File

@ -1,12 +1,10 @@
Best practice for updating Home Assistant Core:
1. Backup your installation{% if page.installation == "os" or page.installation == "supervised" %}, using the [backup functionality](/common-tasks/os/#backups) Home Assistant offers{% endif %}.
1. [Back up your installation](/common-tasks/general/#backups) and store the backup and the [backup emergency kit](/more-info/backup-emergency-kit/) somewhere safe.
- This ensures that you can [restore your installation from backup](/common-tasks/general/#restoring-a-backup) if needed.
2. Check the release notes for backward-incompatible changes on [Home Assistant release notes](/blog/categories/core/). Be sure to check all release notes between the version you are running and the one you are upgrading to. Use the search function in your browser (`CTRL + f` / `CMD + f`) and search for **Backward-incompatible changes**.
{% if page.installation == "os" or page.installation == "supervised" %}
3. Select **Create backup before updating** in case you encounter an issue that requires a rollback.
4. Update Home Assistant.
5. Review persistent notifications and log to see if there are any issues with your configuration that need to be addressed.
{% endif %}
3. Update Home Assistant.
4. Review persistent notifications and log to see if there are any issues with your configuration that need to be addressed.
{% if page.installation == "os" or page.installation == "supervised" %}

View File

@ -0,0 +1,130 @@
{% if include.product and site.data.products[include.product] %}
{% assign product = site.data.products[include.product] %}
{% assign distributor_regions = product.distributors | group_by: 'ship_to' %}
{% endif %}
<div class="ha-buy-dialog">
<div class="ha-buy-dialog-inner">
<div class="ha-buy-dialog-header">
<div class="product-name">{{ product.name }}</div>
<div class="close">
<svg width="24" height="24" viewBox="0 0 24 24">
<path
d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z" />
</svg>
</div>
</div>
<div class="ha-buy-dialog-content">
<div class="ha-buy-dialog-sidebar">
<div class="ha-buy-dialog-sidebar-label">Shipping to</div>
<div class="ha-buy-dialog-sidebar-tabs">
{% for distributor_region in distributor_regions %}
<div class="ha-buy-dialog-sidebar-tab {% if forloop.first %}active{% endif %}" aria-role="tab" aria-selected="true" aria-controls="#{{ distributor_region.name | slugify }}" data-tab="#{{ distributor_region.name | slugify }}">
{{ distributor_region.name }}
</div>
{% endfor %}
</div>
</div>
<div class="ha-buy-dialog-tab-content-wrapper">
{% for distributor_region in distributor_regions %}
<div class="ha-buy-dialog-tab-content {% if forloop.first %}active{% endif %}" id="{{ distributor_region.name | slugify }}">
{% assign az_ship_distributors = distributor_region.items | case_insensitive_sort: 'name' | sort: 'ship_from' %}
<div class="ha-buy-dialog-distributor-items">
{% for distributor in az_ship_distributors %}
<a href="{{ distributor.url }}" target="_blank" class="ha-buy-dialog-distributor-item">
{% if distributor.logo %}
<img src="{{ distributor.logo }}" alt="{{ distributor.name }} logo" class="ha-buy-dialog-distributor-logo">
{% else %}
{{ distributor.name }}
{% endif %}
<span>
Ships from {{ distributor.ship_from }}
</span>
</a>
{% endfor %}
</div>
</div>
{% endfor %}
</div>
</div>
</div>
</div>
<link rel="stylesheet" href="/voice-pe/nice-select2.css" />
<script src="/voice-pe/nice-select2.js" defer></script>
<script>
document.addEventListener('DOMContentLoaded', function () {
let dialog = document.querySelector('.ha-buy-dialog');
let tabs = dialog.querySelectorAll('.ha-buy-dialog-sidebar-tab');
let tabContents = dialog.querySelectorAll('.ha-buy-dialog-tab-content');
tabs.forEach(tab => {
tab.addEventListener('click', function () {
tabs = dialog.querySelectorAll('.ha-buy-dialog-sidebar-tab');
tabs.forEach(tab => tab.classList.remove('active'));
tabContents.forEach(tabContent => tabContent.classList.remove('active'));
let tabContent = dialog.querySelector(tab.getAttribute('data-tab'));
if(!tabContent) return;
tab.classList.add('active');
tabContent.classList.add('active');
})
});
let close = dialog.querySelector('.close');
close.addEventListener('click', function () {
dialog.classList.remove('open');
document.documentElement.style.overflow = "";
});
let openTargets = document.querySelectorAll('.buy');
openTargets.forEach(target => {
target.addEventListener('click', function (e) {
e.preventDefault();
dialog.classList.add('open');
document.documentElement.style.overflow = "hidden";
focusDistributors(dialog);
});
});
if (window.location.hash === '#buy') {
dialog.classList.add('open');
document.documentElement.style.overflow = "hidden";
focusDistributors(dialog);
}
dialog.addEventListener('click', function (e) {
if (!e.target.closest('.ha-buy-dialog-inner')) {
dialog.classList.remove('open');
document.documentElement.style.overflow = "";
}
});
document.addEventListener('keydown', function (e) {
if (e.key === 'Escape') {
dialog.classList.remove('open');
document.documentElement.style.overflow = "";
}
});
});
function focusDistributors(dialog){
let tabs = dialog.querySelectorAll('.ha-buy-dialog-sidebar-tab');
let tabContents = dialog.querySelectorAll('.ha-buy-dialog-tab-content');
let timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
let region = timezone.split('/')[0].toLowerCase();
let defaultTab = dialog.querySelector(`.ha-buy-dialog-sidebar-tab[data-tab="#${region}"]`);
if (defaultTab) {
tabs.forEach(tab => tab.classList.remove('active'));
tabContents.forEach(tabContent => tabContent.classList.remove('active'));
defaultTab.classList.add('active');
let tabContent = document.querySelector(defaultTab.getAttribute('data-tab'));
tabContent.classList.add('active');
}
}
</script>

View File

@ -40,6 +40,43 @@
<a class="button" href="/docs/automation">EXPLORE AUTOMATIONS</a>
</div>
</div>
<div class="card">
<div class="card-header">
{% icon "mdi:view-dashboard" %}
Versatile dashboards
</div>
<div class="card-content">
<p>
Home Assistant dashboards allow you to display information about your smart home. Dashboards are customizable and provide a powerful way to manage your home from your mobile or desktop.
</p>
<ul>
<li>Easily create and customize your dashboards with drag-and-drop.</li>
<li>Different card types to visualize your data and control your smart home devices.</li>
</ul>
<a class="button" href="/dashboards">EXPLORE DASHBOARDS</a>
</div>
</div>
<div class="card">
<div class="card-header">
{% icon "mdi:microphone" %}
Assist, our voice assistant
</div>
<div class="card-content">
<p>
Assist allows you to control Home Assistant using natural language. It is built on top of an open voice foundation and powered by knowledge provided by our community.
</p>
<ul>
<li>Customize your voice assistant and experiment with AI conversations.</li>
<li>Use Assist everywhere on your mobile phone, tablets, smartwatches, and even old-school telephones.</li>
</ul>
<a class="button" href="/voice_control/">EXPLORE ASSIST</a>
</div>
</div>
<div class="card">
<div class="card-header">
{% icon "mdi:puzzle" %}
@ -59,6 +96,7 @@
<a class="button" href="/addons">EXPLORE ADD-ONS</a>
</div>
</div>
<div class="card">
<div class="card-header">
{% icon "mdi:shield-home-outline" %}
@ -74,6 +112,7 @@
</p>
</div>
</div>
<div class="card">
<div class="card-header">
{% icon "mdi:cellphone" %}
@ -122,6 +161,46 @@
</a>
</div>
</div>
<div class="card">
<div class="card-header">
{% icon "mdi:cast-connected" %}
Home Assistant Cast
</div>
<div class="card-content">
<p>
Take over all the screens. Home Assistant Cast makes every TV a display for dashboards.
</p>
<a
class="button"
href="/blog/2019/08/06/home-assistant-cast/"
aria-label="Learn more about Home Assistant Cast"
>
LEARN MORE
</a>
</div>
</div>
<div class="card">
<div class="card-header">
{% icon "mdi:nfc-variant" %}
NFC Tags
</div>
<div class="card-content">
<p>
Use NFC to bring music to your life or automate the mundane.
</p>
<a
class="button"
href="/blog/2020/09/15/home-assistant-tags/"
aria-label="Learn more about Home Assistant Tags"
>
LEARN MORE
</a>
</div>
</div>
</div>
</div>

View File

@ -0,0 +1,52 @@
<section class="grid getting-started">
<div class="grid__item one-whole">
<h2 class="sub-title">Let's get started.</h2>
<p class="lead">A variety of options for pragmatists and tinkerers alike.</p>
</div>
<div class="getting-started-grid grid__item one-whole">
<div class="getting-started-device" id="Raspberry_Pi">
<div class="content">
<div class="badge">Easy</div>
<img src="/images/frontpage/raspberry-pi.png" alt="Raspberry Pi"/>
<div>
<h3>Raspberry Pi</h3>
<p>A low-cost DIY solution to get started with Home Assistant</p>
</div>
<a class="button" aria-label="Learn more about installing Home Assistant on Raspberry Pi" href="/installation/raspberrypi">Learn more</a>
</div>
</div>
<div class="getting-started-device" id="HA_Green">
<div class="content">
<div class="badge">Easiest</div>
<img src="/images/frontpage/ha-green.png" alt="Home Assistant Green"/>
<div>
<h3>Home Assistant Green</h3>
<p>The easiest way to get started with Home Assistant</p>
</div>
<a class="button" aria-label="Learn more about Home Assistant Green" href="/green">Learn more</a>
</div>
</div>
<div class="getting-started-device" id="HA_Yellow">
<div class="content">
<div class="badge">Intermediate</div>
<img src="/images/frontpage/ha-yellow.png" alt="Home Assistant Yellow"/>
<div>
<h3>Home Assistant Yellow</h3>
<p>The powerful way to run and customize Home Assistant to your needs</p>
</div>
<a class="button" aria-label="Learn more about Home Assistant Yellow" href="/yellow">Learn more</a>
</div>
</div>
</div>
<div class="grid__item one-half palm-one-whole">
<h2>Need more options?</h2>
<p>Home Assistant can repurpose and be installed on various hardware, such as an Odroid or a generic x86-64 machine.</p>
<p>The Home Assistant Operating System allows you to install Home Assistant on these devices even if you have little to no Linux experience.</p>
<a class="button" href="/installation#install-on-other-hardware">Get started</a>
</div>
</section>

View File

@ -0,0 +1,170 @@
<!-- Left column begins -->
<div class="grid__item one-third lap-one-half palm-one-whole">
<!-- Recent blog posts -->
<div class="recent-posts material-card text">
<h1>{% icon "mdi:newspaper-variant-multiple" %} Recent Blog Posts</h1>
<ol>
{% for post in site.posts limit: 4 %}
<li class="post" style="display: grid; font-size: 16px">
<a href="{{ post.url }}">{{ post.title }}</a>
<small class="blog-date">{{ post.date_formatted }}</small>
</li>
{% endfor %}
</ol>
</div>
<!-- OHF notice -->
<a href="https://www.openhomefoundation.org/blog/announcing-the-open-home-foundation/" class="material-card highlight-blog-post">
<div>
<p class="lead">We are a non-profit and can't be sold or acquired.</p>
<p>Home Assistant is a project by the Open Home Foundation.</p>
</div>
<iconify-icon icon="mdi:chevron-right"></iconify-icon>
</a>
<a
class="material-card highlight-blog-post"
href="/blog/2016/01/19/perfect-home-automation/"
>
<p class="lead">Read our founder's vision for the perfect home automation</p>
<iconify-icon icon="mdi:chevron-right"></iconify-icon>
</a>
<div class="join-community material-card text">
<h1>{% icon "simple-icons:amazonalexa" %} Alexa, turn on the lights</h1>
Use Alexa to control Home Assistant.
<div class="links">
<a href="/cloud/">Learn more</a>
</div>
</div>
<div class="join-community material-card text">
<h1>{% icon "simple-icons:googleassistant" %} Ok Google, turn off the AC</h1>
Use Google Assistant to control Home Assistant.
<div class="links">
<a href="/cloud/">Learn more</a>
</div>
</div>
<div class="join-community material-card text">
<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">{% 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>
</div>
<!-- Left column ends -->
<!-- Center content begins -->
<div class="grid__item one-third lap-one-half palm-one-whole">
<!-- All landing pages have a block. -->
{% assign pages_by_date = site.pages | sort: "date" | reverse %} {% for
page in pages_by_date %} {% if page.layout == "landingpage" and
page.frontpage != false %}
<a
class="material-card picture-promo"
href="{{page.url}}"
style="
background-image: url({{page.frontpage_image | default:page.og_image}});
background-size: cover;
background-color: #41bdf5;
"
>
<div class="caption">
<div>
<div class="title">
{{page.title}}
</div>
<div class="subtitle">{{page.description}}</div>
</div>
</div>
</a>
{% endif %} {% endfor %}
</div>
<!-- Center sidebar ends -->
<!-- Right content begins -->
<div class="grid__item one-third lap-one-half palm-one-whole">
<!-- State of the Open Home -->
<a
href="/blog/2024/04/24/state-of-the-open-home-2024/"
class="material-card picture-promo"
style="
background-image: url(/images/frontpage/feature-sotoh2024.jpg);
background-size: cover;
padding-top: 55%;
"
>
<div class="caption">
<div>
<div class="title">
State of the Open Home 2024
</div>
<div class="subtitle">
Learn about our progress so far and also the roadmap for this year.
</div>
</div>
</div>
</a>
<!-- Assist -->
<a
class="material-card picture-promo picture-top"
href="/voice_control/"
style="
background-image: url(/images/frontpage/feature-voice.jpg);
background-size: cover;
padding-bottom: 35%;
"
>
<div class="caption">
<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.
</div>
</div>
</div>
</a>
<!-- Merch store -->
<a
class="material-card picture-promo"
href="https://home-assistant-store.creator-spring.com/"
style="background-image: url(/images/merchandise/shirt-frontpage.jpg)"
>
<div class="caption">
<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>
</div>
</div>
</a>
</div>
<!-- Right content ends -->

View File

@ -0,0 +1,101 @@
<section class="grid sponsors-and-press">
<div class="grid__item one-whole">
<h2 class="sub-title">In the press</h2>
<p class="lead">Trusted by home automation experts and more than a million households.</p>
</div>
<div class="seen-press grid__item one-whole">
<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://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://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.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.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.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.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://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="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="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>

View File

@ -1,6 +1,6 @@
<h1>Awaken<br><span class="line2">your home</span></h1>
<p class="lead">
{{ site.description }}
Open source home automation that puts local control and privacy first. Powered by a worldwide community of tinkerers and DIY enthusiasts.
</p>
{%- assign tot = 0 -%}
@ -14,8 +14,33 @@
{%- endif %}
{%- endfor -%}
<p class='hero-buttons'>
<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>
<div class='hero-buttons'>
<a href='/installation/' class="primary">Get started <iconify-icon inline icon='mdi:arrow-right'></iconify-icon></a>
<div>
<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>
</div>
</div>
<div class="hero-socialproof">
<a href="https://github.blog/news-insights/octoverse/octoverse-2024/#the-state-of-open-source" target="_blank" class="">
<div class="hero-github-top-project">
<img src="/images/frontpage/hero-github-logo.svg" alt="GitHub logo"/>
<img src="/images/frontpage/hero-trophy.svg" alt="Top open source project trophy"/>
<p><strong>Top open source project</strong> by contributors in 2024</p>
</div>
</a>
<!-- <div class="hero-socialproof-asseenon">
<p>As seen on</p>
<div class="logos">
<a href="https://www.theverge.com/23744526/smart-home-assistant-how-to-automation" target="_blank">
<img src="/images/frontpage/hero-socialproof-theverge.svg" alt="The Verge"/>
</a>
<a href="https://arstechnica.com/information-technology/2021/03/how-to-achieve-smart-home-nirvana-or-home-automation-without-subscription/" target="_blank">
<img src="/images/frontpage/hero-socialproof-arstechnica.svg" alt="ArsTechnica" height="48"/>
</a>
</div>
</div> -->
</div>

View File

@ -8,5 +8,6 @@ To add the {{ title | downcase }} to your user interface:
- If this is your first time editing a dashboard, the **Edit dashboard** dialog appears.
- By editing the dashboard, you are taking over control of this dashboard.
- This means that it is no longer automatically updated when new dashboard elements become available.
- Once you've taken control, you can't get this specific dashboard back to update automatically. However, you can create a new default dashboard.
- 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.
2. [Add a card and customize actions and features](/dashboards/cards/#adding-cards-to-your-dashboard) to your dashboard.

View File

@ -112,7 +112,7 @@ In order to use Zigbee or other integrations that require access to devices, you
The Home Assistant Container is using an alternative memory allocation library [jemalloc](http://jemalloc.net/) for better memory management and Python runtime speedup.
As jemalloc can cause issues on certain hardware, it can be disabled by passing the environment variable `DISABLE_JEMALLOC` with any value, for example:
As the jemalloc configuration used can cause issues on certain hardware featuring a page size larger than 4K (like some specific ARM64-based SoCs), it can be disabled by passing the environment variable `DISABLE_JEMALLOC` with any value, for example:
{% tabbed_block %}

View File

@ -1,7 +1,6 @@
### Synology NAS
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>
Synology with DSM now supports container management through the Container Manager package, allowing you to install Home Assistant 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/ContainerManager>
The steps would be:
- Install Docker "Container Manager" package on your Synology NAS
@ -86,3 +85,7 @@ The steps would be:
- Your Home Assistant within Docker should now run and will serve the web interface from port 8123 on your Docker host (this will be your Qnap NAS IP address - for example `http://192.xxx.xxx.xxx:8123`)
Remark: To update your Home Assistant on your Docker within Qnap NAS, you just remove container and image and do steps again (Don't remove "config" folder).
### Community Notes
Note that some users have reported issues creating Home Assistant containers on ARM QNAP systems (e.g., TS-233) with Container Station 3. A possible workaround is the "Docker compose" approach based on a YAML file (see section "Docker compose"). In the QNAP Container Station 3 UI, this can be accessed by going to the "Applications" section and clicking on "Create". You are then prompted to enter YAML code, which can be copied from that shown in the "Docker compose" section. Take care to modify this code in two ways: firstly, add a first line reading "version: '3'"; secondly, replace the text "/PATH_TO_YOUR_CONFIG" by a valid path on your NAS system, e.g., "/share/Container/HomeAssistant/config".

Some files were not shown because too many files have changed in this diff Show More