diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index c34491e5358..438e7c5b0ac 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -32,7 +32,8 @@ "gitlens.showWelcomeOnInstall": false, "gitlens.showWhatsNewAfterUpgrades": false, "terminal.integrated.shell.linux": "/usr/bin/zsh", - "workbench.startupEditor": "none" + "workbench.startupEditor": "none", + "rubyLsp.rubyVersionManager": "none" } } } diff --git a/.github/workflows/add_prs_to_project.yml b/.github/workflows/add_prs_to_project.yml deleted file mode 100644 index a0743605184..00000000000 --- a/.github/workflows/add_prs_to_project.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Add new PRs to project - -on: - pull_request_target: - types: - - opened - -jobs: - add-to-project: - name: Add new PR to project - runs-on: ubuntu-latest - steps: - - name: Generate app token - id: token - # Pinned to a specific version of the action for security reasons - uses: tibdex/github-app-token@3beb63f4bd073e61482598c45c71c1019b59b73a # v2.1.0 - with: - app_id: ${{ secrets.PROJECTS_APP_ID }} - private_key: ${{ secrets.PROJECTS_APP_PEM }} - - name: Add to Project - uses: actions/add-to-project@v0.5.0 - with: - project-url: https://github.com/orgs/home-assistant/projects/10 - github-token: ${{ steps.token.outputs.token }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0e94eee4c6b..35a15793d0d 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -8,9 +8,9 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out files from GitHub - uses: actions/checkout@v4.1.1 + uses: actions/checkout@v4.1.6 - name: Setting up Node.js - uses: actions/setup-node@v4.0.1 + uses: actions/setup-node@v4.0.2 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.1 + uses: actions/checkout@v4.1.6 - name: Setting up Node.js - uses: actions/setup-node@v4.0.1 + uses: actions/setup-node@v4.0.2 with: node-version: 20 cache: "npm" diff --git a/.vscode/cSpell.json b/.vscode/cSpell.json index b5f56bd6f61..2029b1293af 100644 --- a/.vscode/cSpell.json +++ b/.vscode/cSpell.json @@ -34,6 +34,7 @@ "Fitbit", "Flexit", "Frenck", + "geofence", "geolocation", "GPSLogger", "Harman", diff --git a/CODEOWNERS b/CODEOWNERS index 2d100b931d2..6bfca80443b 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -12,6 +12,7 @@ source/_integrations/3_day_blinds.markdown @starkillerOG source/_integrations/abode.markdown @shred86 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/advantage_air.markdown @Bre77 @@ -20,12 +21,14 @@ source/_integrations/aep_ohio.markdown @tronikos source/_integrations/aep_texas.markdown @tronikos source/_integrations/agent_dvr.markdown @ispysoftware source/_integrations/air_quality.markdown @home-assistant/core +source/_integrations/airgradient.markdown @airgradienthq @joostlek source/_integrations/airly.markdown @bieniu source/_integrations/airnow.markdown @asymworks source/_integrations/airq.markdown @Sibgatulin @dl2080 -source/_integrations/airthings.markdown @danielhiversen +source/_integrations/airthings.markdown @danielhiversen @LaStrada source/_integrations/airthings_ble.markdown @vincegio @LaStrada source/_integrations/airtouch4.markdown @samsinnamon +source/_integrations/airtouch5.markdown @danzel source/_integrations/airvisual.markdown @bachya source/_integrations/airvisual_pro.markdown @bachya source/_integrations/airzone.markdown @Noltari @@ -36,11 +39,12 @@ source/_integrations/alert.markdown @home-assistant/core @frenck source/_integrations/alexa.markdown @home-assistant/cloud @ochlocracy @jbouwh source/_integrations/alexa.smart_home.markdown @home-assistant/cloud @ochlocracy @jbouwh source/_integrations/amberelectric.markdown @madpilot -source/_integrations/ambiclimate.markdown @danielhiversen +source/_integrations/ambient_network.markdown @thomaskistler source/_integrations/ambient_station.markdown @bachya source/_integrations/amcrest.markdown @flacjacket source/_integrations/amp_motorization.markdown @starkillerOG source/_integrations/analytics.markdown @home-assistant/core @ludeeus +source/_integrations/analytics_insights.markdown @joostlek source/_integrations/android_ip_webcam.markdown @engrbm87 source/_integrations/androidtv.markdown @JeffLIrion @ollo69 source/_integrations/androidtv_remote.markdown @tronikos @Drafteed @@ -55,10 +59,13 @@ source/_integrations/appalachianpower.markdown @tronikos source/_integrations/apple_tv.markdown @postlund 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/aranet.markdown @aschmitz @thecode +source/_integrations/apsystems.markdown @mawoka-myblock @SonnenladenGmbH +source/_integrations/aranet.markdown @aschmitz @thecode @anrijs source/_integrations/arcam_fmj.markdown @elupus 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/asuswrt.markdown @kennedyshead @ollo69 @@ -82,12 +89,13 @@ source/_integrations/azure_service_bus.markdown @hfurubotten source/_integrations/backup.markdown @home-assistant/core source/_integrations/baf.markdown @bdraco @jfroy source/_integrations/balboa.markdown @garbled1 @natekspencer +source/_integrations/bang_olufsen.markdown @mj23000 source/_integrations/bayesian.markdown @HarvsG source/_integrations/beewi_smartclim.markdown @alemuro source/_integrations/bge.markdown @tronikos source/_integrations/binary_sensor.markdown @home-assistant/core source/_integrations/bizkaibus.markdown @UgaitzEtxebarria -source/_integrations/blebox.markdown @bbx-a @riokuu +source/_integrations/blebox.markdown @bbx-a @riokuu @swistakm source/_integrations/blink.markdown @fronzbot @mkmer source/_integrations/bliss_automation.markdown @starkillerOG source/_integrations/bloc_blinds.markdown @starkillerOG @@ -100,9 +108,10 @@ 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 +source/_integrations/brandt.markdown @imicknl @vlebourl @tetienne @nyroDev @tronix117 source/_integrations/braviatv.markdown @bieniu @Drafteed source/_integrations/brel_home.markdown @starkillerOG +source/_integrations/bring.markdown @miaucl @tr4nt0r source/_integrations/broadlink.markdown @danielhiversen @felipediel @L-I-Am @eifinger source/_integrations/brother.markdown @bieniu source/_integrations/brottsplatskartan.markdown @gjohansson-ST @@ -120,7 +129,6 @@ source/_integrations/camera.markdown @home-assistant/core source/_integrations/cast.markdown @emontnemery source/_integrations/ccm15.markdown @ocalvo source/_integrations/cert_expiry.markdown @jjlawren -source/_integrations/circuit.markdown @braam source/_integrations/cisco_ios.markdown @fbradyirl source/_integrations/cisco_mobility_express.markdown @fbradyirl source/_integrations/cisco_webex_teams.markdown @fbradyirl @@ -128,6 +136,7 @@ source/_integrations/climate.markdown @home-assistant/core source/_integrations/cloud.markdown @home-assistant/cloud source/_integrations/cloudflare.markdown @ludeeus @ctalkington source/_integrations/co2signal.markdown @jpbede @VIKTORVAV99 +source/_integrations/coautilities.markdown @tronikos source/_integrations/coinbase.markdown @tombrien source/_integrations/color_extractor.markdown @GenericStudent source/_integrations/comed.markdown @tronikos @@ -143,7 +152,7 @@ source/_integrations/conversation.markdown @home-assistant/core @synesthesiam source/_integrations/coolmaster.markdown @OnFreund source/_integrations/counter.markdown @fabaff source/_integrations/cover.markdown @home-assistant/core -source/_integrations/cozytouch.markdown @imicknl @vlebourl @tetienne @nyroDev +source/_integrations/cozytouch.markdown @imicknl @vlebourl @tetienne @nyroDev @tronix117 source/_integrations/cpuspeed.markdown @fabaff source/_integrations/cribl.markdown @Bre77 source/_integrations/crownstone.markdown @Crownstone @RicArch97 @@ -176,25 +185,26 @@ source/_integrations/discogs.markdown @thibmaek source/_integrations/discord.markdown @tkdrob source/_integrations/discovergy.markdown @jpbede source/_integrations/dlink.markdown @tkdrob -source/_integrations/dlna_dmr.markdown @StevenLooman @chishm +source/_integrations/dlna_dmr.markdown @chishm source/_integrations/dlna_dms.markdown @chishm source/_integrations/dnsip.markdown @gjohansson-ST source/_integrations/doorbird.markdown @oblogic7 @bdraco @flacjacket source/_integrations/dooya.markdown @starkillerOG 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_reader.markdown @depl0y @glodenox +source/_integrations/dsmr_reader.markdown @sorted-bits @glodenox @erwindouna source/_integrations/duotecno.markdown @cereal2nd +source/_integrations/duquesne_light.markdown @tronikos source/_integrations/dwd_weather_warnings.markdown @runningman84 @stephan192 @andarotajo source/_integrations/dynalite.markdown @ziv1234 source/_integrations/eastron.markdown @DCSBL source/_integrations/easyenergy.markdown @klaasnicolaas -source/_integrations/ecobee.markdown @marcolivierarsenault source/_integrations/ecoforest.markdown @pjanuario source/_integrations/econet.markdown @w1ll1am23 -source/_integrations/ecovacs.markdown @OverloadUT @mib1185 +source/_integrations/ecovacs.markdown @OverloadUT @mib1185 @edenhaus @Augar source/_integrations/ecowitt.markdown @pvizeli source/_integrations/efergy.markdown @tkdrob source/_integrations/egardia.markdown @jeroenterheerdt @@ -204,11 +214,13 @@ source/_integrations/elgato.markdown @frenck source/_integrations/elkm1.markdown @gwww @bdraco source/_integrations/elmax.markdown @albertogeniola source/_integrations/elv.markdown @majuss +source/_integrations/elvia.markdown @ludeeus source/_integrations/emby.markdown @mezz64 source/_integrations/emoncms.markdown @borpin source/_integrations/emonitor.markdown @bdraco source/_integrations/emulated_hue.markdown @bdraco @Tho85 source/_integrations/emulated_kasa.markdown @kbickar +source/_integrations/energenie_power_sockets.markdown @gnumpi source/_integrations/energie_vanons.markdown @klaasnicolaas source/_integrations/energy.markdown @home-assistant/core source/_integrations/energyzero.markdown @klaasnicolaas @@ -219,8 +231,10 @@ source/_integrations/enphase_envoy.markdown @bdraco @cgarwood @dgomes @joostlek source/_integrations/entur_public_transport.markdown @hfurubotten source/_integrations/environment_canada.markdown @gwww @michaeldavie source/_integrations/ephember.markdown @ttroy50 +source/_integrations/epic_games_store.markdown @hacf-fr @Quentame +source/_integrations/epion.markdown @lhgravendeel source/_integrations/epson.markdown @pszafer -source/_integrations/epsonworkforce.markdown @ThaStealth +source/_integrations/eq3btsmart.markdown @eulemitkeule @dbuezas source/_integrations/escea.markdown @lazdavila source/_integrations/esera_onewire.markdown @garbled1 @epenet source/_integrations/esphome.markdown @OttoWinter @jesserockz @kbx81 @bdraco @@ -245,7 +259,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 +source/_integrations/flexom.markdown @imicknl @vlebourl @tetienne @nyroDev @tronix117 source/_integrations/flick_electric.markdown @ZephireNZ source/_integrations/flipr.markdown @cnico source/_integrations/flo.markdown @dmulcahey @@ -254,7 +268,7 @@ source/_integrations/flux_led.markdown @icemanch source/_integrations/forecast_solar.markdown @klaasnicolaas @frenck source/_integrations/forked_daapd.markdown @uvjustin source/_integrations/fortios.markdown @kimfrellsen -source/_integrations/foscam.markdown @skgsergio @krmarien +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 @@ -265,6 +279,7 @@ source/_integrations/frontend.markdown @home-assistant/frontend source/_integrations/frontier_silicon.markdown @wlcrs source/_integrations/fujitsu_anywair.markdown @Bre77 source/_integrations/fully_kiosk.markdown @cgarwood +source/_integrations/fyta.markdown @dontinelli source/_integrations/garages_amsterdam.markdown @klaasnicolaas source/_integrations/gardena_bluetooth.markdown @elupus source/_integrations/gaviota.markdown @starkillerOG @@ -294,14 +309,15 @@ 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/gpsd.markdown @fabaff +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 +source/_integrations/habitica.markdown @ASMfreaK @leikoilja @tr4nt0r source/_integrations/hardware.markdown @home-assistant/core -source/_integrations/harmony.markdown @ehendrix23 @bramkragten @bdraco @mkeesey @Aohzan +source/_integrations/harmony.markdown @ehendrix23 @bdraco @mkeesey @Aohzan source/_integrations/hassio.markdown @home-assistant/supervisor source/_integrations/havana_shade.markdown @starkillerOG source/_integrations/hdmi_cec.markdown @inytar @@ -309,17 +325,18 @@ source/_integrations/heatmiser.markdown @andylockran 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 -source/_integrations/hi_kumo.markdown @imicknl @vlebourl @tetienne @nyroDev +source/_integrations/hexaom.markdown @imicknl @vlebourl @tetienne @nyroDev @tronix117 +source/_integrations/hi_kumo.markdown @imicknl @vlebourl @tetienne @nyroDev @tronix117 source/_integrations/hikvision.markdown @mezz64 source/_integrations/hikvisioncam.markdown @fbradyirl source/_integrations/hisense_aehw4a1.markdown @bannhead source/_integrations/history.markdown @home-assistant/core source/_integrations/hive.markdown @Rendili @KJonline +source/_integrations/hko.markdown @MisterCommand source/_integrations/hlk_sw16.markdown @jameshilliard -source/_integrations/holiday.markdown @jrieger +source/_integrations/holiday.markdown @jrieger @gjohansson-ST source/_integrations/home_connect.markdown @DavidMStraub -source/_integrations/home_plus_control.markdown @chemaaa +source/_integrations/home_plus_control.markdown @cgtobi source/_integrations/homeassistant.markdown @home-assistant/core source/_integrations/homeassistant_alerts.markdown @home-assistant/core source/_integrations/homeassistant_green.markdown @home-assistant/core @@ -328,7 +345,8 @@ source/_integrations/homeassistant_sky_connect.markdown @home-assistant/core source/_integrations/homeassistant_yellow.markdown @home-assistant/core source/_integrations/homekit.markdown @bdraco source/_integrations/homekit_controller.markdown @Jc2k @bdraco -source/_integrations/homematic.markdown @pvizeli @danielperna84 +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/http.markdown @home-assistant/core @@ -338,6 +356,8 @@ source/_integrations/huisbaasje.markdown @dennisschroer 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/huum.markdown @frwickst source/_integrations/hvv_departures.markdown @vigonotion source/_integrations/hydrawise.markdown @dknowles2 @ptcryan source/_integrations/hyperion.markdown @dermotduffy @@ -352,6 +372,7 @@ source/_integrations/image.markdown @home-assistant/core source/_integrations/image_processing.markdown @home-assistant/core source/_integrations/image_upload.markdown @home-assistant/core source/_integrations/imap.markdown @jbouwh +source/_integrations/imgw_pib.markdown @bieniu source/_integrations/improv_ble.markdown @emontnemery source/_integrations/incomfort.markdown @zxdavb source/_integrations/indianamichiganpower.markdown @tronikos @@ -374,7 +395,8 @@ source/_integrations/iperf3.markdown @rohankapoorcom source/_integrations/ipma.markdown @dgomes source/_integrations/iqvia.markdown @bachya source/_integrations/irish_rail_transport.markdown @ttroy50 -source/_integrations/islamic_prayer_times.markdown @engrbm87 +source/_integrations/isal.markdown @bdraco +source/_integrations/islamic_prayer_times.markdown @engrbm87 @cpfair source/_integrations/ismartwindow.markdown @starkillerOG source/_integrations/iss.markdown @DurgNomis-drol source/_integrations/isy994.markdown @bdraco @shbatm @@ -383,7 +405,7 @@ source/_integrations/jellyfin.markdown @j-stienstra @ctalkington source/_integrations/jewish_calendar.markdown @tsvi source/_integrations/juicenet.markdown @jesserockz source/_integrations/justnimbus.markdown @kvanzuijlen -source/_integrations/jvc_projector.markdown @SteveEasley +source/_integrations/jvc_projector.markdown @SteveEasley @msavazzi source/_integrations/kaiterra.markdown @Michsior14 source/_integrations/kaleidescape.markdown @SteveEasley source/_integrations/keba.markdown @dannerph @@ -400,8 +422,10 @@ source/_integrations/kodi.markdown @OnFreund source/_integrations/konnected.markdown @heythisisnate source/_integrations/kostal_plenticore.markdown @stegm source/_integrations/kraken.markdown @eifinger +source/_integrations/krispol.markdown @starkillerOG source/_integrations/kulersky.markdown @emlove source/_integrations/lacrosse_view.markdown @IceBotYT +source/_integrations/lamarzocco.markdown @zweckj source/_integrations/lametric.markdown @robbiet480 @frenck @bachya source/_integrations/landisgyr_heat_meter.markdown @vpathuis source/_integrations/lastfm.markdown @joostlek @@ -410,12 +434,12 @@ source/_integrations/laundrify.markdown @xLarry source/_integrations/lawn_mower.markdown @home-assistant/core source/_integrations/lcn.markdown @alengwenus source/_integrations/ld2410_ble.markdown @930913 +source/_integrations/leaone.markdown @bdraco source/_integrations/led_ble.markdown @bdraco source/_integrations/legrand.markdown @cgtobi source/_integrations/leviton_z_wave.markdown @home-assistant/z-wave -source/_integrations/lg_netcast.markdown @Drafteed +source/_integrations/lg_netcast.markdown @Drafteed @splinter98 source/_integrations/lidarr.markdown @tkdrob -source/_integrations/life360.markdown @pnbruckner source/_integrations/light.markdown @home-assistant/core source/_integrations/linear_garage_door.markdown @IceBotYT source/_integrations/linux_battery.markdown @fabaff @@ -428,17 +452,17 @@ source/_integrations/local_todo.markdown @allenporter source/_integrations/lock.markdown @home-assistant/core source/_integrations/logbook.markdown @home-assistant/core source/_integrations/logger.markdown @home-assistant/core -source/_integrations/logi_circle.markdown @evanjd source/_integrations/london_underground.markdown @jpbede source/_integrations/lookin.markdown @ANMalko @bdraco source/_integrations/loqed.markdown @mikewoudenberg source/_integrations/luci.markdown @mzdrale source/_integrations/luftdaten.markdown @fabaff @frenck -source/_integrations/lupusec.markdown @majuss -source/_integrations/lutron.markdown @cdheiser -source/_integrations/lutron_caseta.markdown @swails @bdraco @danaues +source/_integrations/lupusec.markdown @majuss @suaveolent +source/_integrations/lutron.markdown @cdheiser @wilburCForce +source/_integrations/lutron_caseta.markdown @swails @bdraco @danaues @eclair4151 source/_integrations/luxaflex.markdown @bdraco @kingy444 @trullock source/_integrations/lyric.markdown @timmo001 +source/_integrations/madeco.markdown @starkillerOG source/_integrations/marantz.markdown @ol-iver @starkillerOG source/_integrations/martec.markdown @starkillerOG source/_integrations/mastodon.markdown @fabaff @@ -450,7 +474,6 @@ source/_integrations/media_extractor.markdown @joostlek source/_integrations/media_player.markdown @home-assistant/core source/_integrations/media_source.markdown @hunterjm source/_integrations/mediaroom.markdown @dgomes -source/_integrations/melcloud.markdown @vilppuvuorinen source/_integrations/melissa.markdown @kennedyshead source/_integrations/melnor.markdown @vanstinator source/_integrations/met.markdown @danielhiversen @@ -459,6 +482,7 @@ source/_integrations/meteo_france.markdown @hacf-fr @oncleben31 @Quentame source/_integrations/meteoalarm.markdown @rolfberkenbosch source/_integrations/meteoclimatic.markdown @adrianmo source/_integrations/metoffice.markdown @MrHarcombe @avee87 +source/_integrations/microbees.markdown @microBeesTech source/_integrations/mijndomein_energie.markdown @klaasnicolaas source/_integrations/mikrotik.markdown @engrbm87 source/_integrations/mill.markdown @danielhiversen @@ -473,21 +497,23 @@ source/_integrations/modern_forms.markdown @wonderslug source/_integrations/moehlenhoff_alpha2.markdown @j-a-n source/_integrations/monessen.markdown @jeeftor source/_integrations/monoprice.markdown @etsinko @OnFreund +source/_integrations/monzo.markdown @jakemartin-icl 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/motioneye.markdown @dermotduffy -source/_integrations/mqtt.markdown @emontnemery @jbouwh +source/_integrations/mqtt.markdown @emontnemery @jbouwh @bdraco source/_integrations/msteams.markdown @peroyvind source/_integrations/mullvad.markdown @meichthys source/_integrations/mutesync.markdown @currentoor source/_integrations/my.markdown @home-assistant/core -source/_integrations/mypermobil.markdown @IsakNyberg source/_integrations/mysensors.markdown @MartinHjelmare @functionpointer source/_integrations/mystrom.markdown @fabaff +source/_integrations/myuplink.markdown @pajzo @astrandb source/_integrations/nam.markdown @bieniu source/_integrations/nanoleaf.markdown @milanmeu -source/_integrations/neato.markdown @dshokouhi @Santobert +source/_integrations/neato.markdown @Santobert source/_integrations/nederlandse_spoorwegen.markdown @YarmoM source/_integrations/ness_alarm.markdown @nickw444 source/_integrations/nest.markdown @allenporter @@ -497,7 +523,7 @@ 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 +source/_integrations/nexity.markdown @imicknl @vlebourl @tetienne @nyroDev @tronix117 source/_integrations/nextbus.markdown @vividboarder source/_integrations/nextcloud.markdown @mib1185 source/_integrations/nextdns.markdown @bieniu @@ -526,6 +552,7 @@ source/_integrations/nzbget.markdown @chriscla source/_integrations/obihai.markdown @dshokouhi @ejpenney source/_integrations/octoprint.markdown @rfleming71 source/_integrations/ohmconnect.markdown @robbiet480 +source/_integrations/ollama.markdown @synesthesiam source/_integrations/ombi.markdown @larssont source/_integrations/omnilogic.markdown @oliver84 @djtimca @gentoosu source/_integrations/onboarding.markdown @home-assistant/core @@ -551,20 +578,20 @@ 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 +source/_integrations/overkiz.markdown @imicknl @vlebourl @tetienne @nyroDev @tronix117 source/_integrations/ovo_energy.markdown @timmo001 source/_integrations/p1_monitor.markdown @klaasnicolaas source/_integrations/panel_custom.markdown @home-assistant/frontend -source/_integrations/panel_iframe.markdown @home-assistant/frontend source/_integrations/pcs_lighting.markdown @gwww source/_integrations/peco.markdown @IceBotYT source/_integrations/peco_opower.markdown @tronikos source/_integrations/pegel_online.markdown @mib1185 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/philips_js.markdown @elupus -source/_integrations/pi_hole.markdown @johnluetke @shenxn +source/_integrations/pi_hole.markdown @shenxn source/_integrations/picnic.markdown @corneyl source/_integrations/pilight.markdown @trekky12 source/_integrations/ping.markdown @jpbede @@ -596,7 +623,7 @@ source/_integrations/pushover.markdown @engrbm87 source/_integrations/pvoutput.markdown @frenck source/_integrations/pvpc_hourly_pricing.markdown @azogue source/_integrations/qbittorrent.markdown @geoffreylagaisse @finder39 -source/_integrations/qingping.markdown @bdraco @skgsergio +source/_integrations/qingping.markdown @bdraco source/_integrations/qld_bushfire.markdown @exxamalte source/_integrations/qnap.markdown @disforw source/_integrations/qnap_qsw.markdown @Noltari @@ -604,13 +631,15 @@ source/_integrations/quadrafire.markdown @jeeftor source/_integrations/quantum_gateway.markdown @cisasteelersfan source/_integrations/qvr_pro.markdown @oblogic7 source/_integrations/qwikswitch.markdown @kellerza -source/_integrations/rachio.markdown @bdraco +source/_integrations/rabbitair.markdown @rabbit-air +source/_integrations/rachio.markdown @bdraco @rfverbruggen source/_integrations/radarr.markdown @tkdrob source/_integrations/radio_browser.markdown @frenck source/_integrations/radiotherm.markdown @vinnyfuria source/_integrations/rainbird.markdown @konikvranik @allenporter source/_integrations/raincloud.markdown @vanstinator source/_integrations/rainforest_eagle.markdown @gtdiehl @jcalbert @hastarin +source/_integrations/rainforest_raven.markdown @cottsay source/_integrations/rainmachine.markdown @bachya source/_integrations/random.markdown @fabaff source/_integrations/rapt_ble.markdown @sairon @@ -620,7 +649,6 @@ source/_integrations/recollect_waste.markdown @bachya source/_integrations/recorder.markdown @home-assistant/core source/_integrations/recovery_mode.markdown @home-assistant/core source/_integrations/refoss.markdown @ashionky -source/_integrations/rejseplanen.markdown @DarkFox source/_integrations/remote.markdown @home-assistant/core source/_integrations/renault.markdown @epenet source/_integrations/renson.markdown @jimmyd-be @@ -628,7 +656,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 +source/_integrations/rexel.markdown @imicknl @vlebourl @tetienne @nyroDev @tronix117 source/_integrations/rflink.markdown @javicalle source/_integrations/rfxtrx.markdown @danielhiversen @elupus @RobBie1221 source/_integrations/rhasspy.markdown @balloob @synesthesiam @@ -639,7 +667,8 @@ source/_integrations/rituals_perfume_genie.markdown @milanmeu @frenck source/_integrations/rmvtransport.markdown @cgtobi source/_integrations/roborock.markdown @humbertogontijo @Lash-L source/_integrations/roku.markdown @ctalkington -source/_integrations/roomba.markdown @pschmitt @cyr-ius @shenxn @Xitee1 +source/_integrations/romy.markdown @xeniter +source/_integrations/roomba.markdown @pschmitt @cyr-ius @shenxn @Xitee1 @Orhideous source/_integrations/roon.markdown @pavoni source/_integrations/rpi_power.markdown @shenxn @swetoast source/_integrations/rss_feed_template.markdown @home-assistant/core @@ -648,9 +677,11 @@ source/_integrations/ruckus_unleashed.markdown @lanrat @ms264556 @gabe565 source/_integrations/ruuvi_gateway.markdown @akx source/_integrations/ruuvitag_ble.markdown @akx source/_integrations/rympro.markdown @OnFreund @elad-bar @maorcc -source/_integrations/sabnzbd.markdown @shaiu +source/_integrations/sabnzbd.markdown @shaiu @jpbede source/_integrations/saj.markdown @fredericvl +source/_integrations/samsam.markdown @klaasnicolaas source/_integrations/samsungtv.markdown @chemelli74 @epenet +source/_integrations/sanix.markdown @tomaszsluszniak source/_integrations/scene.markdown @home-assistant/core source/_integrations/schedule.markdown @home-assistant/core source/_integrations/schlage.markdown @dknowles2 @@ -674,6 +705,7 @@ source/_integrations/sentry.markdown @dcramer @frenck source/_integrations/senz.markdown @milanmeu source/_integrations/serial.markdown @fabaff source/_integrations/seven_segments.markdown @fabaff +source/_integrations/seventeentrack.markdown @shaiu source/_integrations/sfr_box.markdown @epenet source/_integrations/sharkiq.markdown @JeffResc @funkybunch source/_integrations/shell_command.markdown @home-assistant/core @@ -685,7 +717,7 @@ source/_integrations/signal_messenger.markdown @bbernhard source/_integrations/simplepush.markdown @engrbm87 source/_integrations/simplisafe.markdown @bachya source/_integrations/simply_automated.markdown @gwww -source/_integrations/simu.markdown @imicknl @vlebourl @tetienne @nyroDev +source/_integrations/simu.markdown @imicknl @vlebourl @tetienne @nyroDev @tronix117 source/_integrations/sinch.markdown @bendikrb source/_integrations/siren.markdown @home-assistant/core @raman325 source/_integrations/sisyphus.markdown @jkeljo @@ -701,22 +733,23 @@ source/_integrations/smart_blinds.markdown @starkillerOG source/_integrations/smart_home.markdown @starkillerOG source/_integrations/smart_meter_texas.markdown @grahamwetzler source/_integrations/smarther.markdown @cgtobi -source/_integrations/smartthings.markdown @andrewsayre source/_integrations/smarttub.markdown @mdz source/_integrations/smarty.markdown @z0mbieprocess source/_integrations/smhi.markdown @gjohansson-ST source/_integrations/sms.markdown @ocalvo +source/_integrations/smud.markdown @tronikos source/_integrations/snapcast.markdown @luar123 +source/_integrations/snmp.markdown @nmaggioni source/_integrations/snooz.markdown @AustinBrunkhorst -source/_integrations/solaredge.markdown @frenck +source/_integrations/solaredge.markdown @frenck @bdraco source/_integrations/solaredge_local.markdown @drobtravels @scheric source/_integrations/solarlog.markdown @Ernst79 source/_integrations/solax.markdown @squishykid source/_integrations/soma.markdown @ratsept @sebfortier2288 -source/_integrations/somfy.markdown @imicknl @vlebourl @tetienne @nyroDev +source/_integrations/somfy.markdown @imicknl @vlebourl @tetienne @nyroDev @tronix117 source/_integrations/sonarr.markdown @ctalkington source/_integrations/songpal.markdown @rytilahti @shenxn -source/_integrations/sonos.markdown @jjlawren +source/_integrations/sonos.markdown @jjlawren @peterager source/_integrations/soundtouch.markdown @kroimon source/_integrations/spaceapi.markdown @fabaff source/_integrations/speedtestdotnet.markdown @rohankapoorcom @engrbm87 @@ -749,35 +782,38 @@ source/_integrations/switch.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 +source/_integrations/switchbot_cloud.markdown @SeraphicRav @laurence-presland source/_integrations/switcher_kis.markdown @thecode source/_integrations/switchmate.markdown @danielhiversen @qiz-li -source/_integrations/symfonisk.markdown @jjlawren +source/_integrations/symfonisk.markdown @jjlawren @peterager source/_integrations/syncthing.markdown @zhulik source/_integrations/syncthru.markdown @nielstron 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 @michaelarnauts @chiefdragon @erwindouna +source/_integrations/tado.markdown @chiefdragon @erwindouna source/_integrations/tag.markdown @balloob @dmulcahey source/_integrations/tailscale.markdown @frenck source/_integrations/tailwind.markdown @frenck source/_integrations/tami4.markdown @Guy293 -source/_integrations/tankerkoenig.markdown @guillempages @mib1185 +source/_integrations/tankerkoenig.markdown @guillempages @mib1185 @jpbede source/_integrations/tapsaff.markdown @bazwilliams source/_integrations/tasmota.markdown @emontnemery 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/tesla_wall_connector.markdown @einarhauks +source/_integrations/teslemetry.markdown @Bre77 source/_integrations/tessie.markdown @Bre77 source/_integrations/text.markdown @home-assistant/core source/_integrations/tfiac.markdown @fredrike @mellado source/_integrations/thermobeacon.markdown @bdraco source/_integrations/thermoplus.markdown @bdraco -source/_integrations/thermopro.markdown @bdraco -source/_integrations/thethingsnetwork.markdown @fabaff +source/_integrations/thermopro.markdown @bdraco @h3ss +source/_integrations/thethingsnetwork.markdown @angelnu source/_integrations/thread.markdown @home-assistant/core source/_integrations/tibber.markdown @danielhiversen source/_integrations/tile.markdown @bachya @@ -790,9 +826,11 @@ source/_integrations/todoist.markdown @boralyl source/_integrations/tolo.markdown @MatthiasLohr source/_integrations/tomorrowio.markdown @raman325 @lymanepp source/_integrations/totalconnect.markdown @austinmroczek -source/_integrations/tplink.markdown @rytilahti @thegardenmonkey @bdraco +source/_integrations/tplink.markdown @rytilahti @thegardenmonkey @bdraco @sdb9696 source/_integrations/tplink_omada.markdown @MarkGodwin +source/_integrations/tplink_tapo.markdown @rytilahti @thegardenmonkey @bdraco @sdb9696 source/_integrations/traccar.markdown @ludeeus +source/_integrations/traccar_server.markdown @ludeeus source/_integrations/tractive.markdown @Danielhiversen @zhulik @bieniu source/_integrations/trafikverket_camera.markdown @gjohansson-ST source/_integrations/trafikverket_ferry.markdown @gjohansson-ST @@ -805,12 +843,12 @@ source/_integrations/tuya.markdown @Tuya @zlinoliver @frenck 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 +source/_integrations/ubiwizz.markdown @imicknl @vlebourl @tetienne @nyroDev @tronix117 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 @AngellusMortis @bdraco +source/_integrations/unifiprotect.markdown @bdraco source/_integrations/upb.markdown @gwww source/_integrations/upc_connect.markdown @pvizeli @fabaff source/_integrations/upcloud.markdown @scop @@ -824,10 +862,10 @@ source/_integrations/usgs_earthquakes_feed.markdown @exxamalte source/_integrations/utility_meter.markdown @dgomes source/_integrations/v2c.markdown @dgomes source/_integrations/vacuum.markdown @home-assistant/core -source/_integrations/vallox.markdown @andre-richter @slovdahl @viiru- +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 +source/_integrations/velux.markdown @Julius2342 @DeerMaximum source/_integrations/venstar.markdown @garbled1 @jhollowe source/_integrations/vermont_castings.markdown @jeeftor source/_integrations/versasense.markdown @imstevenxyz @@ -854,8 +892,10 @@ source/_integrations/watttime.markdown @bachya source/_integrations/waze_travel_time.markdown @eifinger source/_integrations/weather.markdown @home-assistant/core source/_integrations/weatherflow.markdown @natekspencer @jeeftor +source/_integrations/weatherflow_cloud.markdown @jeeftor source/_integrations/weatherkit.markdown @tjhorner 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/wemo.markdown @esev @@ -868,7 +908,7 @@ source/_integrations/wirelesstag.markdown @sergeymaysak source/_integrations/withings.markdown @joostlek source/_integrations/wiz.markdown @sbidy source/_integrations/wled.markdown @frenck -source/_integrations/wolflink.markdown @adamkrol93 +source/_integrations/wolflink.markdown @adamkrol93 @mtielen source/_integrations/workday.markdown @fabaff @gjohansson-ST source/_integrations/worldclock.markdown @fabaff source/_integrations/ws66i.markdown @ssaenger @@ -898,7 +938,8 @@ source/_integrations/zerproc.markdown @emlove source/_integrations/zeversolar.markdown @kvanzuijlen source/_integrations/zha.markdown @dmulcahey @adminiuga @puddly @TheJulianJES source/_integrations/zodiac.markdown @JulienTant +source/_integrations/zondergas.markdown @klaasnicolaas source/_integrations/zone.markdown @home-assistant/core -source/_integrations/zoneminder.markdown @rohankapoorcom +source/_integrations/zoneminder.markdown @rohankapoorcom @nabbi source/_integrations/zwave_js.markdown @home-assistant/z-wave source/_integrations/zwave_me.markdown @lawfulchaos @Z-Wave-Me @PoltoS diff --git a/Gemfile b/Gemfile index 0ac5a5572b1..f1628c5573a 100644 --- a/Gemfile +++ b/Gemfile @@ -3,26 +3,27 @@ source 'https://rubygems.org' ruby '> 2.5.0' group :development do - gem 'rake', '13.1.0' + gem 'rake', '13.2.1' gem 'jekyll', '4.3.3' 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.59.0' - gem 'ruby-lsp', '0.13.2' + gem 'rubocop', '1.64.1' + gem 'ruby-lsp', '0.17.2' + gem 'rackup', '2.1.0' end group :jekyll_plugins do gem 'jekyll-paginate', '1.1.0' gem 'jekyll-sitemap', '1.4.0' gem 'jekyll-commonmark', '1.4.0' - gem 'jekyll-toc', '0.18.0' + gem 'jekyll-toc', '0.19.0' end -gem 'sinatra', '3.2.0' -gem 'nokogiri', '1.16.0' +gem 'sinatra', '4.0.0' +gem 'nokogiri', '1.16.5' # Windows and JRuby does not include zoneinfo files, so bundle the tzinfo-data gem # and associated library diff --git a/Gemfile.lock b/Gemfile.lock index de746fb893e..1bc80e1afd0 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -5,6 +5,7 @@ GEM public_suffix (>= 2.0.2, < 6.0) ast (2.4.2) base64 (0.2.0) + bigdecimal (3.1.8) chunky_png (1.4.0) colorator (1.1.0) commonmarker (0.23.10) @@ -20,16 +21,18 @@ GEM sass (>= 3.3.0, < 3.5) compass-import-once (1.0.5) sass (>= 3.2, < 3.5) - concurrent-ruby (1.2.2) + concurrent-ruby (1.3.1) em-websocket (0.5.3) eventmachine (>= 0.12.9) http_parser.rb (~> 0) eventmachine (1.2.7) - ffi (1.16.3) + ffi (1.17.0-x86_64-linux-gnu) forwardable-extended (2.6.0) - google-protobuf (3.25.1-x86_64-linux) + google-protobuf (4.27.1-x86_64-linux) + bigdecimal + rake (>= 13) http_parser.rb (0.8.0) - i18n (1.14.1) + i18n (1.14.5) concurrent-ruby (~> 1.0) jekyll (4.3.3) addressable (~> 2.4) @@ -54,88 +57,96 @@ GEM sass-embedded (~> 1.54) jekyll-sitemap (1.4.0) jekyll (>= 3.7, < 5.0) - jekyll-toc (0.18.0) + jekyll-toc (0.19.0) jekyll (>= 3.9) nokogiri (~> 1.12) jekyll-watch (2.2.1) listen (~> 3.0) - json (2.7.1) + json (2.7.2) kramdown (2.4.0) rexml kramdown-parser-gfm (1.1.0) kramdown (~> 2.0) language_server-protocol (3.17.0.3) liquid (4.0.4) - listen (3.8.0) + listen (3.9.0) rb-fsevent (~> 0.10, >= 0.10.3) rb-inotify (~> 0.9, >= 0.9.10) mercenary (0.4.0) multi_json (1.15.0) mustermann (3.0.0) ruby2_keywords (~> 0.0.1) - nokogiri (1.16.0-x86_64-linux) + nokogiri (1.16.5-x86_64-linux) racc (~> 1.4) parallel (1.24.0) - parser (3.3.0.2) + parser (3.3.2.0) ast (~> 2.4.1) racc pathutil (0.16.2) forwardable-extended (~> 2.6) - prism (0.19.0) - public_suffix (5.0.4) - racc (1.7.3) - rack (2.2.8) - rack-protection (3.2.0) + prism (0.29.0) + public_suffix (5.0.5) + racc (1.8.0) + rack (3.0.11) + rack-protection (4.0.0) base64 (>= 0.1.0) - rack (~> 2.2, >= 2.2.4) + rack (>= 3.0.0, < 4) + rack-session (2.0.0) + rack (>= 3.0.0) + rackup (2.1.0) + rack (>= 3) + webrick (~> 1.8) rainbow (3.1.1) - rake (13.1.0) + rake (13.2.1) rb-fsevent (0.11.2) - rb-inotify (0.10.1) + rb-inotify (0.11.1) ffi (~> 1.0) - regexp_parser (2.9.0) - rexml (3.2.6) - rouge (4.2.0) - rubocop (1.59.0) + regexp_parser (2.9.2) + rexml (3.2.8) + strscan (>= 3.0.9) + rouge (4.2.1) + rubocop (1.64.1) json (~> 2.3) language_server-protocol (>= 3.17.0) parallel (~> 1.10) - parser (>= 3.2.2.4) + parser (>= 3.3.0.2) rainbow (>= 2.2.2, < 4.0) regexp_parser (>= 1.8, < 3.0) rexml (>= 3.2.5, < 4.0) - rubocop-ast (>= 1.30.0, < 2.0) + rubocop-ast (>= 1.31.1, < 2.0) ruby-progressbar (~> 1.7) unicode-display_width (>= 2.4.0, < 3.0) - rubocop-ast (1.30.0) - parser (>= 3.2.1.0) - ruby-lsp (0.13.2) + rubocop-ast (1.31.3) + parser (>= 3.3.1.0) + ruby-lsp (0.17.2) language_server-protocol (~> 3.17.0) - prism (>= 0.19.0, < 0.20) - sorbet-runtime (>= 0.5.5685) + prism (>= 0.29.0, < 0.30) + 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.69.7-x86_64-linux-gnu) - google-protobuf (~> 3.25) + sass-embedded (1.77.4-x86_64-linux-gnu) + google-protobuf (>= 3.25, < 5.0) sass-globbing (1.1.5) sass (>= 3.1) sassc (2.1.0-x86_64-linux) ffi (~> 1.9) - sinatra (3.2.0) + sinatra (4.0.0) mustermann (~> 3.0) - rack (~> 2.2, >= 2.2.4) - rack-protection (= 3.2.0) + rack (>= 3.0.0, < 4) + rack-protection (= 4.0.0) + rack-session (>= 2.0.0, < 3) tilt (~> 2.0) - sorbet-runtime (0.5.11178) + sorbet-runtime (0.5.11418) stringex (2.8.6) + strscan (3.1.0) terminal-table (3.0.2) unicode-display_width (>= 1.1.1, < 3) tilt (2.3.0) tzinfo (2.0.6) concurrent-ruby (~> 1.0) - tzinfo-data (1.2023.4) + tzinfo-data (1.2024.1) tzinfo (>= 1.0.0) unicode-display_width (2.5.0) webrick (1.8.1) @@ -149,14 +160,15 @@ DEPENDENCIES jekyll-commonmark (= 1.4.0) jekyll-paginate (= 1.1.0) jekyll-sitemap (= 1.4.0) - jekyll-toc (= 0.18.0) - nokogiri (= 1.16.0) - rake (= 13.1.0) - rubocop (= 1.59.0) - ruby-lsp (= 0.13.2) + jekyll-toc (= 0.19.0) + nokogiri (= 1.16.5) + rackup (= 2.1.0) + rake (= 13.2.1) + rubocop (= 1.64.1) + ruby-lsp (= 0.17.2) sass-globbing (= 1.1.5) sassc (= 2.1.0) - sinatra (= 3.2.0) + sinatra (= 4.0.0) stringex (= 2.8.6) tzinfo (~> 2.0) tzinfo-data diff --git a/_config.yml b/_config.yml index 50024c42613..4e34b300108 100644 --- a/_config.yml +++ b/_config.yml @@ -109,9 +109,9 @@ social: # Home Assistant release details current_major_version: 2024 -current_minor_version: 1 -current_patch_version: 2 -date_released: 2024-01-06 +current_minor_version: 6 +current_patch_version: 1 +date_released: 2024-06-07 # Either # or the anchor link to latest release notes in the blog post. # Must be prefixed with a # and have double quotes around it. @@ -195,7 +195,7 @@ toc: installation: container: "ghcr.io/home-assistant/home-assistant" versions: - python: "3.11" + python: "3.12" types: odroid: board: ODROID @@ -211,11 +211,15 @@ installation: key: "odroid-c4" - name: "ODROID-M1" key: "odroid-m1" + - name: "ODROID-M1S" + key: "odroid-m1s" raspberrypi: board: Raspberry Pi installation_media: "SD card" variants: + - name: "Raspberry Pi 5" + key: "rpi5-64" - name: "Raspberry Pi 4" key: "rpi4-64" - name: "Raspberry Pi 3" diff --git a/package-lock.json b/package-lock.json index 8c47c032407..bc0699d8d9d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,22 +8,22 @@ "name": "home-assistant.io", "version": "1.0.0", "devDependencies": { - "remark-cli": "^12.0.0", + "remark-cli": "^12.0.1", "remark-frontmatter": "^5.0.0", - "remark-lint": "^9.1.2", - "remark-lint-fenced-code-flag": "^3.1.2", - "remark-lint-heading-increment": "^3.1.2", - "remark-lint-heading-style": "^3.1.2", - "remark-lint-no-shell-dollars": "^3.1.2", - "remark-lint-ordered-list-marker-style": "^3.1.2", - "remark-lint-ordered-list-marker-value": "^3.1.2", - "remark-lint-prohibited-strings": "^3.1.0", - "remark-lint-unordered-list-marker-style": "^3.1.2", + "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-prohibited-strings": "^4.0.0", + "remark-lint-unordered-list-marker-style": "^4.0.0", "remark-stringify": "^11.0.0", - "textlint": "^13.4.1", + "textlint": "^14.0.4", "textlint-filter-rule-comments": "^1.2.2", "textlint-rule-common-misspellings": "^1.0.1", - "textlint-rule-terminology": "^4.0.1" + "textlint-rule-terminology": "^5.0.10" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -416,57 +416,68 @@ "dev": true }, "node_modules/@textlint/ast-tester": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@textlint/ast-tester/-/ast-tester-13.4.1.tgz", - "integrity": "sha512-YSHUR1qDgMPGF5+nvrquEhif6zRJ667xUnfP/9rTNtThIhoTQINvczr5/7xa43F1PDWplL6Curw+2jrE1qHwGQ==", + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@textlint/ast-tester/-/ast-tester-14.0.4.tgz", + "integrity": "sha512-SQ/2DjxVlDVeCEjVlD8c8R2Sl3VGDZEx8o9+i8bV8NUdY8qsSHbo29/BfiUZf/uaX6eeNpZsurtstJ25hbVrsQ==", "dev": true, "dependencies": { - "@textlint/ast-node-types": "^13.4.1", + "@textlint/ast-node-types": "^14.0.4", "debug": "^4.3.4" } }, + "node_modules/@textlint/ast-tester/node_modules/@textlint/ast-node-types": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.0.4.tgz", + "integrity": "sha512-O7L1pgle030Co9ou1+6e2/6GgcIpKgqwEc0XiBabokc22Yl0QEkrf00K/usBDmSx+wo1ficWBux2mfBEF0jnDA==", + "dev": true + }, "node_modules/@textlint/ast-traverse": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@textlint/ast-traverse/-/ast-traverse-13.4.1.tgz", - "integrity": "sha512-uucuC7+NHWkXx2TX5vuyreuHeb+GFiA83V65I+FnYP5EC4dAMOQ86rTSPrZmCwLz+qIWgfDgihGzPccpj3EZGg==", + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@textlint/ast-traverse/-/ast-traverse-14.0.4.tgz", + "integrity": "sha512-bzFC7UJ2FvhjH5ekXGQ0i9vjK+xzMT69gHBsYVEl+TtbplnH2YY3+sbw6B1j3LocJuo6xngZ2YWXXqmQlKgzLg==", "dev": true, "dependencies": { - "@textlint/ast-node-types": "^13.4.1" + "@textlint/ast-node-types": "^14.0.4" } }, + "node_modules/@textlint/ast-traverse/node_modules/@textlint/ast-node-types": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.0.4.tgz", + "integrity": "sha512-O7L1pgle030Co9ou1+6e2/6GgcIpKgqwEc0XiBabokc22Yl0QEkrf00K/usBDmSx+wo1ficWBux2mfBEF0jnDA==", + "dev": true + }, "node_modules/@textlint/config-loader": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@textlint/config-loader/-/config-loader-13.4.1.tgz", - "integrity": "sha512-ggh6her5PdgcEsvgm3FfCY2+r7IhoQoBTGYxM+IbfkwyVoSoQ2CrXbCVlQkpLPFzhHVbIwgNxkiMr1o2npwfJQ==", + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@textlint/config-loader/-/config-loader-14.0.4.tgz", + "integrity": "sha512-qgAvZ1RcTq58+yNbzhaKHsb52yHRxt8SRpG7S4WFjYj2DEStjIxzssSQvlZtEBjSUQ7RZNJ93d+pL0YK8MIVoA==", "dev": true, "dependencies": { - "@textlint/kernel": "^13.4.1", - "@textlint/module-interop": "^13.4.1", - "@textlint/types": "^13.4.1", - "@textlint/utils": "^13.4.1", + "@textlint/kernel": "^14.0.4", + "@textlint/module-interop": "^14.0.4", + "@textlint/types": "^14.0.4", + "@textlint/utils": "^14.0.4", "debug": "^4.3.4", "rc-config-loader": "^4.1.3", "try-resolve": "^1.0.1" } }, "node_modules/@textlint/feature-flag": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@textlint/feature-flag/-/feature-flag-13.4.1.tgz", - "integrity": "sha512-qY8gKUf30XtzWMTkwYeKytCo6KPx6milpz8YZhuRsEPjT/5iNdakJp5USWDQWDrwbQf7RbRncQdU+LX5JbM9YA==", + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@textlint/feature-flag/-/feature-flag-14.0.4.tgz", + "integrity": "sha512-1FMZqnjOA4KVpt/aloI1fNs46P0rUeHWcCRKl33/08wRHHMdcbaN4EsHkq7UfriuSfFgUuiyeo0bPjCpv15hhQ==", "dev": true }, "node_modules/@textlint/fixer-formatter": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@textlint/fixer-formatter/-/fixer-formatter-13.4.1.tgz", - "integrity": "sha512-P195Soyxmzv7S5QyCJIjuDXl5t3EyOhYwxR4ukKBZ7bw5hp/P1+e4GEhzqrXWx3z7h0nZZ0TuTjepNxOMo6cAQ==", + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@textlint/fixer-formatter/-/fixer-formatter-14.0.4.tgz", + "integrity": "sha512-HkMxzGPo/pgA9UvddqJG6qm62ICNgil3AmBVp0QpOv5uTV1u9gCSQ5jOdb/aOJBw7W8fd+CcnEsEBYn9HT8e6A==", "dev": true, "dependencies": { - "@textlint/module-interop": "^13.4.1", - "@textlint/types": "^13.4.1", + "@textlint/module-interop": "^14.0.4", + "@textlint/types": "^14.0.4", "chalk": "^4.1.2", "debug": "^4.3.4", - "diff": "^4.0.2", - "is-file": "^1.0.0", + "diff": "^5.2.0", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "text-table": "^0.2.0", @@ -474,33 +485,39 @@ } }, "node_modules/@textlint/kernel": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@textlint/kernel/-/kernel-13.4.1.tgz", - "integrity": "sha512-r2sUhjPysFjl2Ax37x9AfWkJM8jgKN0bL4SX3xRzOukdcj69Dst5On5qBZtULaVMX1LDkwkdxA6ZEADmq27qQA==", + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@textlint/kernel/-/kernel-14.0.4.tgz", + "integrity": "sha512-6WNoEBZ4lYTYOGK4EEEdjp+kgxSSC1nIFwN6tY9XGVkd4OACzDNothVTvJBwaX73FWFG5zoSjnNQxBDPUHMc8g==", "dev": true, "dependencies": { - "@textlint/ast-node-types": "^13.4.1", - "@textlint/ast-tester": "^13.4.1", - "@textlint/ast-traverse": "^13.4.1", - "@textlint/feature-flag": "^13.4.1", - "@textlint/source-code-fixer": "^13.4.1", - "@textlint/types": "^13.4.1", - "@textlint/utils": "^13.4.1", + "@textlint/ast-node-types": "^14.0.4", + "@textlint/ast-tester": "^14.0.4", + "@textlint/ast-traverse": "^14.0.4", + "@textlint/feature-flag": "^14.0.4", + "@textlint/source-code-fixer": "^14.0.4", + "@textlint/types": "^14.0.4", + "@textlint/utils": "^14.0.4", "debug": "^4.3.4", "fast-equals": "^4.0.3", "structured-source": "^4.0.0" } }, + "node_modules/@textlint/kernel/node_modules/@textlint/ast-node-types": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.0.4.tgz", + "integrity": "sha512-O7L1pgle030Co9ou1+6e2/6GgcIpKgqwEc0XiBabokc22Yl0QEkrf00K/usBDmSx+wo1ficWBux2mfBEF0jnDA==", + "dev": true + }, "node_modules/@textlint/linter-formatter": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-13.4.1.tgz", - "integrity": "sha512-VDLnyHRO9hf6CGxMJLM5oi7NH9s0mqiWxtgi95nuXmJZWbQLZVfcxkD1Cp16pwk8zTvlbyMZFqamFCYZyD9Sww==", + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@textlint/linter-formatter/-/linter-formatter-14.0.4.tgz", + "integrity": "sha512-EQZJPydExEIvBARkdmkoGsKWie1ekNAiqerQgIqwPb3SqOzKnlaDGrZOMy40HufTcacZrrvlbByDyai6m30+Lw==", "dev": true, "dependencies": { "@azu/format-text": "^1.0.2", "@azu/style-format": "^1.0.1", - "@textlint/module-interop": "^13.4.1", - "@textlint/types": "^13.4.1", + "@textlint/module-interop": "^14.0.4", + "@textlint/types": "^14.0.4", "chalk": "^4.1.2", "debug": "^4.3.4", "js-yaml": "^3.14.1", @@ -514,22 +531,28 @@ } }, "node_modules/@textlint/markdown-to-ast": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@textlint/markdown-to-ast/-/markdown-to-ast-13.4.1.tgz", - "integrity": "sha512-jUa5bTNmxjEgfCXW4xfn7eSJqzUXyNKiIDWLKtI4MUKRNhT3adEaa/NuQl0Mii3Hu3HraZR7hYhRHLh+eeM43w==", + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@textlint/markdown-to-ast/-/markdown-to-ast-14.0.4.tgz", + "integrity": "sha512-D9UUxnRJoNROVjOa9bhoQPDdRvlvS/xP3MJo0Kl6b/mJFi0dOlW31WUfpOFjZkp4uXkL+oo0ji7AMnmV6JORsQ==", "dev": true, "dependencies": { - "@textlint/ast-node-types": "^13.4.1", + "@textlint/ast-node-types": "^14.0.4", "debug": "^4.3.4", "mdast-util-gfm-autolink-literal": "^0.1.3", "remark-footnotes": "^3.0.0", "remark-frontmatter": "^3.0.0", "remark-gfm": "^1.0.0", "remark-parse": "^9.0.0", - "traverse": "^0.6.7", + "traverse": "^0.6.8", "unified": "^9.2.2" } }, + "node_modules/@textlint/markdown-to-ast/node_modules/@textlint/ast-node-types": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.0.4.tgz", + "integrity": "sha512-O7L1pgle030Co9ou1+6e2/6GgcIpKgqwEc0XiBabokc22Yl0QEkrf00K/usBDmSx+wo1ficWBux2mfBEF0jnDA==", + "dev": true + }, "node_modules/@textlint/markdown-to-ast/node_modules/bail": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", @@ -757,61 +780,73 @@ } }, "node_modules/@textlint/module-interop": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-13.4.1.tgz", - "integrity": "sha512-keM5zHwyifijEDqEvAFhhXHC5UbmZjfGytRJzPPJaW3C3UsGbIzDCnfOSE9jUVTWZcngHuSJ7aKGv42Rhy9nEg==", + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@textlint/module-interop/-/module-interop-14.0.4.tgz", + "integrity": "sha512-okv52pRSQ1aeC8rim8qp2D2Fmj/oKDYGY2itdeZhj9E/vdkU9/r7OpdcxyuNiuqLEd/sWw03EAwt3S6mlfNIOw==", "dev": true }, "node_modules/@textlint/source-code-fixer": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@textlint/source-code-fixer/-/source-code-fixer-13.4.1.tgz", - "integrity": "sha512-Sl29f3Tpimp0uVE3ysyJBjxaFTVYLOXiJX14eWCQ/kC5ZhIXGosEbStzkP1n8Urso1rs1W4p/2UemVAm3NH2ng==", + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@textlint/source-code-fixer/-/source-code-fixer-14.0.4.tgz", + "integrity": "sha512-gIUeWjF0WdSwgCUhW310hKJsWOyRyFe6PGaqqCk7Mhc+vVcePfmC8mmmhVgeuyys/Dhe+0iaP4M1eJf4COaIQw==", "dev": true, "dependencies": { - "@textlint/types": "^13.4.1", + "@textlint/types": "^14.0.4", "debug": "^4.3.4" } }, "node_modules/@textlint/text-to-ast": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@textlint/text-to-ast/-/text-to-ast-13.4.1.tgz", - "integrity": "sha512-vCA7uMmbjRv06sEHPbwxTV5iS8OQedC5s7qwmXnWAn2LLWxg4Yp98mONPS1o4D5cPomzYyKNCSfbLwu6yJBUQA==", + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@textlint/text-to-ast/-/text-to-ast-14.0.4.tgz", + "integrity": "sha512-r2KSnKzhsCIvX72yX+7sEuu9nDQIS4+xRsSffuXYB0etRQUI6VTTsE6Ibd6yMbEsMDUF4BfKWzNGn+bQ8U7oHA==", "dev": true, "dependencies": { - "@textlint/ast-node-types": "^13.4.1" + "@textlint/ast-node-types": "^14.0.4" } }, + "node_modules/@textlint/text-to-ast/node_modules/@textlint/ast-node-types": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.0.4.tgz", + "integrity": "sha512-O7L1pgle030Co9ou1+6e2/6GgcIpKgqwEc0XiBabokc22Yl0QEkrf00K/usBDmSx+wo1ficWBux2mfBEF0jnDA==", + "dev": true + }, "node_modules/@textlint/textlint-plugin-markdown": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-markdown/-/textlint-plugin-markdown-13.4.1.tgz", - "integrity": "sha512-OcLkFKYmbYeGJ0kj2487qcicCYTiE2vJLwfPcUDJrNoMYak5JtvHJfWffck8gON2mEM00DPkHH0UdxZpFjDfeg==", + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-markdown/-/textlint-plugin-markdown-14.0.4.tgz", + "integrity": "sha512-mqQieI9U5GTRTjkK4Cj57Axl6fVloaA8g0+sCsp3TjmNWyEgGBvt3aw+FIUiFTvheg9L3RGe/aXgvp5ORADOAA==", "dev": true, "dependencies": { - "@textlint/markdown-to-ast": "^13.4.1" + "@textlint/markdown-to-ast": "^14.0.4" } }, "node_modules/@textlint/textlint-plugin-text": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-text/-/textlint-plugin-text-13.4.1.tgz", - "integrity": "sha512-z0p5B8WUfTCIRmhjVHFfJv719oIElDDKWOIZei4CyYkfMGo0kq8fkrYBkUR6VZ6gofHwc+mwmIABdUf1rDHzYA==", + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@textlint/textlint-plugin-text/-/textlint-plugin-text-14.0.4.tgz", + "integrity": "sha512-HwTQyOcwDRrPPHyD8lwSMyGR1ETasR2WK6BLO0PRbowRe6K/K4b9OBBd6+nJcRFa+9Nd6p7nxPzA2WxDi1X/Zg==", "dev": true, "dependencies": { - "@textlint/text-to-ast": "^13.4.1" + "@textlint/text-to-ast": "^14.0.4" } }, "node_modules/@textlint/types": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@textlint/types/-/types-13.4.1.tgz", - "integrity": "sha512-1ApwQa31sFmiJeJ5yTNFqjbb2D1ICZvIDW0tFSM0OtmQCSDFNcKD3YrrwDBgSokZ6gWQq/FpNjlhi6iETUWt0Q==", + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@textlint/types/-/types-14.0.4.tgz", + "integrity": "sha512-SNdFG/GB6utYeHmNfoAMlI+K1NykPxK9TtilkEfhr/fF9TqmeeJ+6CMk5NLQzEvfKm6jUbv2pp5DPS27vo6GKg==", "dev": true, "dependencies": { - "@textlint/ast-node-types": "^13.4.1" + "@textlint/ast-node-types": "^14.0.4" } }, + "node_modules/@textlint/types/node_modules/@textlint/ast-node-types": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.0.4.tgz", + "integrity": "sha512-O7L1pgle030Co9ou1+6e2/6GgcIpKgqwEc0XiBabokc22Yl0QEkrf00K/usBDmSx+wo1ficWBux2mfBEF0jnDA==", + "dev": true + }, "node_modules/@textlint/utils": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/@textlint/utils/-/utils-13.4.1.tgz", - "integrity": "sha512-wX8RT1ejHAPTDmqlzngf0zI5kYoe3QvGDcj+skoTxSv+m/wOs/NyEr92d+ahCP32YqFYzXlqU7aDx2FkULKT+g==", + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@textlint/utils/-/utils-14.0.4.tgz", + "integrity": "sha512-/ThtVZCB/vB2e8+MnKquCFNO2cKXCPEGxFlkdvJ5g9q9ODpVyFcf2ogYoIlvR7cNotvq67zVjENS7dsGDNFEmw==", "dev": true }, "node_modules/@types/concat-stream": { @@ -833,24 +868,24 @@ } }, "node_modules/@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "node_modules/@types/estree-jsx": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.0.tgz", - "integrity": "sha512-3qvGd0z8F2ENTGr/GG1yViqfiKmRfrXVx5sJyHGFu3z7m5g5utCQtGp/g29JnjflhtQJBv1WDQukHiT58xPcYQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", "dev": true, "dependencies": { "@types/estree": "*" } }, "node_modules/@types/hast": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", - "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dev": true, "dependencies": { "@types/unist": "*" @@ -1082,6 +1117,16 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/character-entities-legacy": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", @@ -1153,6 +1198,16 @@ "node": ">=8" } }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1284,9 +1339,9 @@ } }, "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "dev": true, "engines": { "node": ">=0.3.1" @@ -1566,9 +1621,9 @@ } }, "node_modules/import-meta-resolve": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-3.0.0.tgz", - "integrity": "sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", "dev": true, "funding": { "type": "github", @@ -1685,12 +1740,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-file/-/is-file-1.0.0.tgz", - "integrity": "sha512-ZGMuc+xA8mRnrXtmtf2l/EkIW2zaD2LSBWlaOVEF6yH4RTndHob65V4SwWWdtGKVthQfXPVKsXqw4TDUjbVxVQ==", - "dev": true - }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -1825,15 +1874,6 @@ "node": ">=6" } }, - "node_modules/kleur": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", - "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -1980,19 +2020,28 @@ } }, "node_modules/mdast-comment-marker": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/mdast-comment-marker/-/mdast-comment-marker-2.1.2.tgz", - "integrity": "sha512-HED3ezseRVkBzZ0uK4q6RJMdufr/2p3VfVZstE3H1N9K8bwtspztWo6Xd7rEatuGNoCXaBna8oEqMwUn0Ve1bw==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-comment-marker/-/mdast-comment-marker-3.0.0.tgz", + "integrity": "sha512-bt08sLmTNg00/UtVDiqZKocxqvQqqyQZAg1uaRuO/4ysXV5motg7RolF5o5yy/sY1rG0v2XgZEqFWho1+2UquA==", "dev": true, "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-mdx-expression": "^1.1.0" + "@types/mdast": "^4.0.0", + "mdast-util-mdx-expression": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-comment-marker/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/mdast-util-find-and-replace": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-1.1.1.tgz", @@ -2101,23 +2150,51 @@ } }, "node_modules/mdast-util-from-markdown": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-1.3.0.tgz", - "integrity": "sha512-HN3W1gRIuN/ZW295c7zi7g9lVBllMgZE40RxCX37wrTPWXCWtpvOZdfnuK+1WNpvZje6XuJeI3Wnb4TJEUem+g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", + "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", "dev": true, "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", - "mdast-util-to-string": "^3.1.0", - "micromark": "^3.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-decode-string": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "unist-util-stringify-position": "^3.0.0", - "uvu": "^0.5.0" + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true + }, + "node_modules/mdast-util-from-markdown/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", @@ -2169,574 +2246,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/mdast-util-frontmatter/node_modules/mdast-util-from-markdown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", - "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", - "dev": true, - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/mdast-util-phrasing": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.0.0.tgz", - "integrity": "sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==", - "dev": true, - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/mdast-util-to-markdown": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", - "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", - "dev": true, - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "dev": true, - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/micromark": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", - "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/micromark-core-commonmark": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", - "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/micromark-factory-destination": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", - "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/micromark-factory-label": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", - "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/micromark-factory-title": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", - "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/micromark-factory-whitespace": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", - "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/micromark-util-chunked": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", - "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/micromark-util-classify-character": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", - "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/micromark-util-combine-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", - "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.0.tgz", - "integrity": "sha512-pIgcsGxpHEtTG/rPJRz/HOLSqp5VTuIIjXlPI+6JSDlK2oljApusG6KzpS8AF0ENUMCHlC/IBb5B9xdFiVlm5Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/micromark-util-decode-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", - "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/micromark-util-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", - "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/mdast-util-frontmatter/node_modules/micromark-util-html-tag-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", - "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/mdast-util-frontmatter/node_modules/micromark-util-normalize-identifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", - "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/micromark-util-resolve-all": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", - "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/micromark-util-sanitize-uri": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", - "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/micromark-util-subtokenize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", - "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/mdast-util-frontmatter/node_modules/micromark-util-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/mdast-util-frontmatter/node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-frontmatter/node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/mdast-util-gfm": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-0.1.2.tgz", @@ -3022,12 +2531,38 @@ } }, "node_modules/mdast-util-heading-style": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-heading-style/-/mdast-util-heading-style-2.0.1.tgz", - "integrity": "sha512-0L5rthU4xKDVbw+UQ7D8Y8xOEsX4JXZvemWoEAsL+WAaeSH+TvVVwFnTb3G/OrjyP4VYQULoNWU+PdZfkmNu4A==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-heading-style/-/mdast-util-heading-style-3.0.0.tgz", + "integrity": "sha512-tsUfM9Kj9msjlemA/38Z3pvraQay880E3zP2NgIthMoGcpU9bcPX9oSM6QC/+eFXGGB4ba+VCB1dKAPHB7Veug==", "dev": true, "dependencies": { - "@types/mdast": "^3.0.0" + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-heading-style/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "dev": true, + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, "funding": { "type": "opencollective", @@ -3035,49 +2570,268 @@ } }, "node_modules/mdast-util-mdx-expression": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-1.3.2.tgz", - "integrity": "sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz", + "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==", "dev": true, "dependencies": { "@types/estree-jsx": "^1.0.0", - "@types/hast": "^2.0.0", - "@types/mdast": "^3.0.0", - "mdast-util-from-markdown": "^1.0.0", - "mdast-util-to-markdown": "^1.0.0" + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-mdx-expression/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz", + "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==", + "dev": true, + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^5.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true + }, + "node_modules/mdast-util-mdx-jsx/node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dev": true, + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/parse-entities": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", + "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==", + "dev": true, + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz", + "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==", + "dev": true + }, + "node_modules/mdast-util-mdx-jsx/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "dev": true, + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/mdast-util-phrasing": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-3.0.1.tgz", - "integrity": "sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", "dev": true, "dependencies": { - "@types/mdast": "^3.0.0", - "unist-util-is": "^5.0.0" + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-to-markdown": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-1.5.0.tgz", - "integrity": "sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==", + "node_modules/mdast-util-phrasing/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", "dev": true, "dependencies": { - "@types/mdast": "^3.0.0", - "@types/unist": "^2.0.0", + "@types/unist": "*" + } + }, + "node_modules/mdast-util-phrasing/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", + "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", + "dev": true, + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^3.0.0", - "mdast-util-to-string": "^3.0.0", - "micromark-util-decode-string": "^1.0.0", - "unist-util-visit": "^4.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" }, "funding": { @@ -3085,23 +2839,76 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/mdast-util-to-string": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-3.1.1.tgz", - "integrity": "sha512-tGvhT94e+cVnQt8JWE9/b3cUQZWS732TJxXHktvP+BYo62PpYD53Ls/6cC60rW21dW+txxiM4zMdc6abASvZKA==", + "node_modules/mdast-util-to-markdown/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", "dev": true, "dependencies": { - "@types/mdast": "^3.0.0" + "@types/unist": "*" + } + }, + "node_modules/mdast-util-to-markdown/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true + }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, + "node_modules/mdast-util-to-markdown/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dev": true, + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/micromark": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-3.1.0.tgz", - "integrity": "sha512-6Mj0yHLdUZjHnOPgr5xfWIMqMWS12zDN6iws9SLuSz76W8jTtAv24MN4/CL7gJrl5vtxGInkkqDv/JIoRsQOvA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", + "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", "dev": true, "funding": [ { @@ -3117,26 +2924,26 @@ "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", - "micromark-core-commonmark": "^1.0.1", - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-combine-extensions": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-sanitize-uri": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-core-commonmark": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-1.0.6.tgz", - "integrity": "sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", + "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", "dev": true, "funding": [ { @@ -3150,21 +2957,21 @@ ], "dependencies": { "decode-named-character-reference": "^1.0.0", - "micromark-factory-destination": "^1.0.0", - "micromark-factory-label": "^1.0.0", - "micromark-factory-space": "^1.0.0", - "micromark-factory-title": "^1.0.0", - "micromark-factory-whitespace": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-chunked": "^1.0.0", - "micromark-util-classify-character": "^1.0.0", - "micromark-util-html-tag-name": "^1.0.0", - "micromark-util-normalize-identifier": "^1.0.0", - "micromark-util-resolve-all": "^1.0.0", - "micromark-util-subtokenize": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.1", - "uvu": "^0.5.0" + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-footnote": { @@ -3216,58 +3023,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, "node_modules/micromark-extension-gfm": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-0.3.3.tgz", @@ -3449,9 +3204,9 @@ } }, "node_modules/micromark-factory-destination": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-1.0.0.tgz", - "integrity": "sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", + "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", "dev": true, "funding": [ { @@ -3464,15 +3219,15 @@ } ], "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-label": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-1.0.2.tgz", - "integrity": "sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", + "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", "dev": true, "funding": [ { @@ -3485,16 +3240,16 @@ } ], "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-space": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-1.0.0.tgz", - "integrity": "sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", + "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", "dev": true, "funding": [ { @@ -3507,14 +3262,14 @@ } ], "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-types": "^1.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-title": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-1.0.2.tgz", - "integrity": "sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", + "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", "dev": true, "funding": [ { @@ -3527,17 +3282,16 @@ } ], "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-whitespace": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-1.0.0.tgz", - "integrity": "sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", + "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", "dev": true, "funding": [ { @@ -3550,16 +3304,16 @@ } ], "dependencies": { - "micromark-factory-space": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-character": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-1.1.0.tgz", - "integrity": "sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", "dev": true, "funding": [ { @@ -3572,14 +3326,14 @@ } ], "dependencies": { - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-chunked": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-1.0.0.tgz", - "integrity": "sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", + "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", "dev": true, "funding": [ { @@ -3592,13 +3346,13 @@ } ], "dependencies": { - "micromark-util-symbol": "^1.0.0" + "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-classify-character": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-1.0.0.tgz", - "integrity": "sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", + "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", "dev": true, "funding": [ { @@ -3611,15 +3365,15 @@ } ], "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-combine-extensions": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-1.0.0.tgz", - "integrity": "sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", + "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", "dev": true, "funding": [ { @@ -3632,14 +3386,14 @@ } ], "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-types": "^1.0.0" + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-1.0.0.tgz", - "integrity": "sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz", + "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==", "dev": true, "funding": [ { @@ -3652,13 +3406,13 @@ } ], "dependencies": { - "micromark-util-symbol": "^1.0.0" + "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-decode-string": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-1.0.2.tgz", - "integrity": "sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", + "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", "dev": true, "funding": [ { @@ -3672,15 +3426,15 @@ ], "dependencies": { "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^1.0.0", - "micromark-util-decode-numeric-character-reference": "^1.0.0", - "micromark-util-symbol": "^1.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-encode": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-1.0.1.tgz", - "integrity": "sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", + "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", "dev": true, "funding": [ { @@ -3694,9 +3448,9 @@ ] }, "node_modules/micromark-util-html-tag-name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-1.1.0.tgz", - "integrity": "sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", + "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", "dev": true, "funding": [ { @@ -3710,9 +3464,9 @@ ] }, "node_modules/micromark-util-normalize-identifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-1.0.0.tgz", - "integrity": "sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", + "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", "dev": true, "funding": [ { @@ -3725,13 +3479,13 @@ } ], "dependencies": { - "micromark-util-symbol": "^1.0.0" + "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-resolve-all": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-1.0.0.tgz", - "integrity": "sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", + "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", "dev": true, "funding": [ { @@ -3744,13 +3498,13 @@ } ], "dependencies": { - "micromark-util-types": "^1.0.0" + "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-sanitize-uri": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-1.1.0.tgz", - "integrity": "sha512-RoxtuSCX6sUNtxhbmsEFQfWzs8VN7cTctmBPvYivo98xb/kDEoTCtJQX5wyzIYEmk/lvNFTat4hL8oW0KndFpg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", + "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", "dev": true, "funding": [ { @@ -3763,15 +3517,15 @@ } ], "dependencies": { - "micromark-util-character": "^1.0.0", - "micromark-util-encode": "^1.0.0", - "micromark-util-symbol": "^1.0.0" + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-subtokenize": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-1.0.2.tgz", - "integrity": "sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", + "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", "dev": true, "funding": [ { @@ -3784,16 +3538,16 @@ } ], "dependencies": { - "micromark-util-chunked": "^1.0.0", - "micromark-util-symbol": "^1.0.0", - "micromark-util-types": "^1.0.0", - "uvu": "^0.5.0" + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-1.0.1.tgz", - "integrity": "sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", "dev": true, "funding": [ { @@ -3807,9 +3561,9 @@ ] }, "node_modules/micromark-util-types": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-1.0.2.tgz", - "integrity": "sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", "dev": true, "funding": [ { @@ -3870,15 +3624,6 @@ "mkdirp": "bin/cmd.js" } }, - "node_modules/mri": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", - "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -4182,6 +3927,16 @@ "node": ">=6" } }, + "node_modules/quotation": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/quotation/-/quotation-2.0.3.tgz", + "integrity": "sha512-yEc24TEgCFLXx7D4JHJJkK4JFVtatO8fziwUxY4nB/Jbea9o9CVS3gt22mA0W7rPYAGW2fWzYDSOtD94PwOyqA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/rc-config-loader": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/rc-config-loader/-/rc-config-loader-4.1.3.tgz", @@ -4367,12 +4122,12 @@ } }, "node_modules/remark-cli": { - "version": "12.0.0", - "resolved": "https://registry.npmjs.org/remark-cli/-/remark-cli-12.0.0.tgz", - "integrity": "sha512-IGxCo2VsXC/GS2YdlF7+S8DsUiyULyiauik01NFoiMIrOlbDhXjrKLD8hYazwQdD67nw2k7cwOBIxcK/cbNd9Q==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/remark-cli/-/remark-cli-12.0.1.tgz", + "integrity": "sha512-2NAEOACoTgo+e+YAaCTODqbrWyhMVmlUyjxNCkTrDRHHQvH6+NbrnqVvQaLH/Q8Ket3v90A43dgAJmXv8y5Tkw==", "dev": true, "dependencies": { - "import-meta-resolve": "^3.0.0", + "import-meta-resolve": "^4.0.0", "markdown-extensions": "^2.0.0", "remark": "^15.0.0", "unified-args": "^11.0.0" @@ -4506,14 +4261,14 @@ } }, "node_modules/remark-lint": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/remark-lint/-/remark-lint-9.1.2.tgz", - "integrity": "sha512-m9e/aPlh7tsvfJfj8tPxrQzD6oEdb9Foko+Ya/6OwUP9EoGMfehv1Qtv26W1DoH58Wn8rT8CD+KuprTWscMmIA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/remark-lint/-/remark-lint-10.0.0.tgz", + "integrity": "sha512-E8yHHDOJ8b+qI0G49BRu24pe8t0fNNBWv8ENQJpCGNrVeTeyBIGEbaUe1yuF7OG8faA6PVpcN/pqWjzW9fcBWQ==", "dev": true, "dependencies": { - "@types/mdast": "^3.0.0", - "remark-message-control": "^7.0.0", - "unified": "^10.1.0" + "@types/mdast": "^4.0.0", + "remark-message-control": "^8.0.0", + "unified": "^11.0.0" }, "funding": { "type": "opencollective", @@ -4521,17 +4276,123 @@ } }, "node_modules/remark-lint-fenced-code-flag": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/remark-lint-fenced-code-flag/-/remark-lint-fenced-code-flag-3.1.2.tgz", - "integrity": "sha512-yh4m3dlPmRsqM/BFhpqHYfrmBvFQ+D5dZZKDDYP2rf3YEoXlEVt8T8lWQueTTSxcq6yXAqL/XQL/iqqUHlLcHw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-fenced-code-flag/-/remark-lint-fenced-code-flag-4.0.0.tgz", + "integrity": "sha512-Zs0wJd4nRvBo/9NWQVfWg5Ykapbo0Zzw/SyZc3f0h73S1gTZZcfeU+bA5oDivlBdcUgLBsyHRE0QaoaVvN3/Wg==", "dev": true, "dependencies": { - "@types/mdast": "^3.0.0", - "unified": "^10.0.0", - "unified-lint-rule": "^2.0.0", - "unist-util-generated": "^2.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0" + "@types/mdast": "^4.0.0", + "mdast-util-phrasing": "^4.0.0", + "quotation": "^2.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-fenced-code-flag/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/remark-lint-fenced-code-flag/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true + }, + "node_modules/remark-lint-fenced-code-flag/node_modules/unified": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", + "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-fenced-code-flag/node_modules/unified-lint-rule": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unified-lint-rule/-/unified-lint-rule-3.0.0.tgz", + "integrity": "sha512-Sz96ILLsTy3djsG3H44zFb2b77MFf9CQVYnV3PWkxgRX8/n31fFrr+JnzUaJ6cbOHTtZnL1A71+YodsTjzwAew==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "trough": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-fenced-code-flag/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-fenced-code-flag/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-fenced-code-flag/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-fenced-code-flag/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { "type": "opencollective", @@ -4539,16 +4400,123 @@ } }, "node_modules/remark-lint-heading-increment": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/remark-lint-heading-increment/-/remark-lint-heading-increment-3.1.2.tgz", - "integrity": "sha512-+fMfZmFh6ie6MmbRCVW77Rha15zDmnHWKiA0Do08OTrfngPTv8ZKXYLmxhUpL+xV9ts9q+9Kz5rv0L4QD4sEwQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-heading-increment/-/remark-lint-heading-increment-4.0.0.tgz", + "integrity": "sha512-TARnsjXWzY/yLwxh/y4+KnDSXO3Koue8Crp55T8G9pjj3vw+XgTAG35zSpIIY9HmGiQ2a3R0SOj2pAxATpnckg==", "dev": true, "dependencies": { - "@types/mdast": "^3.0.0", - "unified": "^10.0.0", - "unified-lint-rule": "^2.0.0", - "unist-util-generated": "^2.0.0", - "unist-util-visit": "^4.0.0" + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-mdx": "^3.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-heading-increment/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/remark-lint-heading-increment/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true + }, + "node_modules/remark-lint-heading-increment/node_modules/unified": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", + "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-heading-increment/node_modules/unified-lint-rule": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unified-lint-rule/-/unified-lint-rule-3.0.0.tgz", + "integrity": "sha512-Sz96ILLsTy3djsG3H44zFb2b77MFf9CQVYnV3PWkxgRX8/n31fFrr+JnzUaJ6cbOHTtZnL1A71+YodsTjzwAew==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "trough": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-heading-increment/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-heading-increment/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-heading-increment/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-heading-increment/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { "type": "opencollective", @@ -4556,17 +4524,124 @@ } }, "node_modules/remark-lint-heading-style": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/remark-lint-heading-style/-/remark-lint-heading-style-3.1.2.tgz", - "integrity": "sha512-0RkcRPV/H2bPFgeInzBkK1cWUwtFTm83I+Db/Z5tDY02GzKOosHLvxtJyj/1391/opAH1LYbHtHWffir99IUgw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-heading-style/-/remark-lint-heading-style-4.0.0.tgz", + "integrity": "sha512-dQ6Jul5K0+aNUvrq4W7H0+osSoC9hsmwHZqBFq000+eMP/hWJqI8tuudw1rap8HHYuOsKLRbB5q+Fr7G+3Vw+Q==", "dev": true, "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-util-heading-style": "^2.0.0", - "unified": "^10.0.0", - "unified-lint-rule": "^2.0.0", - "unist-util-generated": "^2.0.0", - "unist-util-visit": "^4.0.0" + "@types/mdast": "^4.0.0", + "mdast-util-heading-style": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-heading-style/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/remark-lint-heading-style/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true + }, + "node_modules/remark-lint-heading-style/node_modules/unified": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", + "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-heading-style/node_modules/unified-lint-rule": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unified-lint-rule/-/unified-lint-rule-3.0.0.tgz", + "integrity": "sha512-Sz96ILLsTy3djsG3H44zFb2b77MFf9CQVYnV3PWkxgRX8/n31fFrr+JnzUaJ6cbOHTtZnL1A71+YodsTjzwAew==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "trough": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-heading-style/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-heading-style/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-heading-style/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-heading-style/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { "type": "opencollective", @@ -4574,16 +4649,122 @@ } }, "node_modules/remark-lint-no-shell-dollars": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/remark-lint-no-shell-dollars/-/remark-lint-no-shell-dollars-3.1.2.tgz", - "integrity": "sha512-np2MDEhXHviXhbQFjnC1QYv5/fxCV1cIHfGMoJpqiW7Zcu/UGCOo5TE3XswZH4ukHZJ65c3X2A6qfLDW+ur3CQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-no-shell-dollars/-/remark-lint-no-shell-dollars-4.0.0.tgz", + "integrity": "sha512-ye2h8FzjsgqqQV0HHN2g9N4FqI3eD9Gpgu7tU5ADIJyQ3mUJdwBoFn7IlGnpmumR1fb/l6u/AhRavIZxXYqG+Q==", "dev": true, "dependencies": { - "@types/mdast": "^3.0.0", - "unified": "^10.0.0", - "unified-lint-rule": "^2.0.0", - "unist-util-generated": "^2.0.0", - "unist-util-visit": "^4.0.0" + "@types/mdast": "^4.0.0", + "collapse-white-space": "^2.0.0", + "mdast-util-phrasing": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-no-shell-dollars/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/remark-lint-no-shell-dollars/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true + }, + "node_modules/remark-lint-no-shell-dollars/node_modules/unified": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", + "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-no-shell-dollars/node_modules/unified-lint-rule": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unified-lint-rule/-/unified-lint-rule-3.0.0.tgz", + "integrity": "sha512-Sz96ILLsTy3djsG3H44zFb2b77MFf9CQVYnV3PWkxgRX8/n31fFrr+JnzUaJ6cbOHTtZnL1A71+YodsTjzwAew==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "trough": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-no-shell-dollars/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-no-shell-dollars/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-no-shell-dollars/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-no-shell-dollars/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { "type": "opencollective", @@ -4591,17 +4772,190 @@ } }, "node_modules/remark-lint-ordered-list-marker-style": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/remark-lint-ordered-list-marker-style/-/remark-lint-ordered-list-marker-style-3.1.2.tgz", - "integrity": "sha512-62iVE/YQsA0Azaqt8yAJWPplWLS47kDLjXeC2PlRIAzCqbNt9qH3HId8vZ15QTSrp8rHmJwrCMdcqV6AZUi7gQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-ordered-list-marker-style/-/remark-lint-ordered-list-marker-style-4.0.0.tgz", + "integrity": "sha512-xZ7Xppy5fzACH4b9h1b4lTzVtNY2AlUkNTfl1Oe6cIKN8tk3juFxN0wL2RpktPtSZ7iRIabzFmg6l8WPhlASJA==", "dev": true, "dependencies": { - "@types/mdast": "^3.0.0", - "unified": "^10.0.0", - "unified-lint-rule": "^2.0.0", - "unist-util-generated": "^2.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0" + "@types/mdast": "^4.0.0", + "mdast-util-phrasing": "^4.0.0", + "micromark-util-character": "^2.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-ordered-list-marker-style/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/remark-lint-ordered-list-marker-style/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true + }, + "node_modules/remark-lint-ordered-list-marker-style/node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dev": true, + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-ordered-list-marker-style/node_modules/micromark-util-character": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz", + "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/remark-lint-ordered-list-marker-style/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", + "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/remark-lint-ordered-list-marker-style/node_modules/micromark-util-types": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", + "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ] + }, + "node_modules/remark-lint-ordered-list-marker-style/node_modules/unified": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", + "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-ordered-list-marker-style/node_modules/unified-lint-rule": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unified-lint-rule/-/unified-lint-rule-3.0.0.tgz", + "integrity": "sha512-Sz96ILLsTy3djsG3H44zFb2b77MFf9CQVYnV3PWkxgRX8/n31fFrr+JnzUaJ6cbOHTtZnL1A71+YodsTjzwAew==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "trough": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-ordered-list-marker-style/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-ordered-list-marker-style/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-ordered-list-marker-style/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-ordered-list-marker-style/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { "type": "opencollective", @@ -4609,17 +4963,125 @@ } }, "node_modules/remark-lint-ordered-list-marker-value": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/remark-lint-ordered-list-marker-value/-/remark-lint-ordered-list-marker-value-3.1.2.tgz", - "integrity": "sha512-kG08nhsFk8rhoXK5EeDN/wN28CxefraDud/MaZnji8LEyxF3HAkzFuETr9laOn8Ey+n8h/C0mpqAwUf4thyJ5g==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-ordered-list-marker-value/-/remark-lint-ordered-list-marker-value-4.0.0.tgz", + "integrity": "sha512-7UjNU2Nv9LGEONTU9GPmTVoNoGKD5aL1X2xHzMbSJiTc50bfcazYqZawO+qj1pQ04WPhto1qHnl0HRB5wwSVwA==", "dev": true, "dependencies": { - "@types/mdast": "^3.0.0", - "unified": "^10.0.0", - "unified-lint-rule": "^2.0.0", - "unist-util-generated": "^2.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0" + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-phrasing": "^4.0.0", + "micromark-util-character": "^2.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-ordered-list-marker-value/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/remark-lint-ordered-list-marker-value/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true + }, + "node_modules/remark-lint-ordered-list-marker-value/node_modules/unified": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", + "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-ordered-list-marker-value/node_modules/unified-lint-rule": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unified-lint-rule/-/unified-lint-rule-3.0.0.tgz", + "integrity": "sha512-Sz96ILLsTy3djsG3H44zFb2b77MFf9CQVYnV3PWkxgRX8/n31fFrr+JnzUaJ6cbOHTtZnL1A71+YodsTjzwAew==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "trough": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-ordered-list-marker-value/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-ordered-list-marker-value/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-ordered-list-marker-value/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-ordered-list-marker-value/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { "type": "opencollective", @@ -4627,18 +5089,24 @@ } }, "node_modules/remark-lint-prohibited-strings": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/remark-lint-prohibited-strings/-/remark-lint-prohibited-strings-3.1.0.tgz", - "integrity": "sha512-zwfDDdYl7ye0gEHcwhdkv1ZGXj1ibw4gnLLZkkvySnDdTz2tshY3fOJLY5NikbVseaIRVGOr5qa+8J9WNQT/fA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-prohibited-strings/-/remark-lint-prohibited-strings-4.0.0.tgz", + "integrity": "sha512-dfLF4da5v3klRAdkHBLpNIC7WpvNdN7Eylgf+p19HPJn53CaxqlGjFvAQDAJU83xXEPWAmdonlx04GIS5ryLow==", "dev": true, "dependencies": { "escape-string-regexp": "^5.0.0", "unified-lint-rule": "^2.0.0", - "unist-util-position": "^4.0.1", - "unist-util-visit": "^4.0.0", - "vfile-location": "^4.0.1" + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile-location": "^5.0.1" } }, + "node_modules/remark-lint-prohibited-strings/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true + }, "node_modules/remark-lint-prohibited-strings/node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", @@ -4651,18 +5119,229 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/remark-lint-unordered-list-marker-style": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/remark-lint-unordered-list-marker-style/-/remark-lint-unordered-list-marker-style-3.1.2.tgz", - "integrity": "sha512-JFiyB4ZprJGGndCaFB8FssXd48m4Kh+CUqzNgu3lBLEiW8dEAGRlD9M2AzyyA+Q29WJP/FntDCbP22DeON91UA==", + "node_modules/remark-lint-prohibited-strings/node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", "dev": true, "dependencies": { - "@types/mdast": "^3.0.0", - "unified": "^10.0.0", - "unified-lint-rule": "^2.0.0", - "unist-util-generated": "^2.0.0", - "unist-util-position": "^4.0.0", - "unist-util-visit": "^4.0.0" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-prohibited-strings/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-unordered-list-marker-style": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/remark-lint-unordered-list-marker-style/-/remark-lint-unordered-list-marker-style-4.0.0.tgz", + "integrity": "sha512-XlP4Wr4KJNovyWVv0H5axfUlF23iE9Kt2SxaVq4+ieum5YcMmKE6KsL+aqt3kiJb60SH1u6a0bxKFvdM/9riOA==", + "dev": true, + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-phrasing": "^4.0.0", + "unified-lint-rule": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit-parents": "^6.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-unordered-list-marker-style/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/remark-lint-unordered-list-marker-style/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true + }, + "node_modules/remark-lint-unordered-list-marker-style/node_modules/unified": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", + "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-unordered-list-marker-style/node_modules/unified-lint-rule": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unified-lint-rule/-/unified-lint-rule-3.0.0.tgz", + "integrity": "sha512-Sz96ILLsTy3djsG3H44zFb2b77MFf9CQVYnV3PWkxgRX8/n31fFrr+JnzUaJ6cbOHTtZnL1A71+YodsTjzwAew==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "trough": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-unordered-list-marker-style/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-unordered-list-marker-style/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-unordered-list-marker-style/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint-unordered-list-marker-style/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/remark-lint/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true + }, + "node_modules/remark-lint/node_modules/unified": { + "version": "11.0.4", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz", + "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-lint/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { "type": "opencollective", @@ -4670,16 +5349,72 @@ } }, "node_modules/remark-message-control": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/remark-message-control/-/remark-message-control-7.1.1.tgz", - "integrity": "sha512-xKRWl1NTBOKed0oEtCd8BUfH5m4s8WXxFFSoo7uUwx6GW/qdCy4zov5LfPyw7emantDmhfWn5PdIZgcbVcWMDQ==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/remark-message-control/-/remark-message-control-8.0.0.tgz", + "integrity": "sha512-brpzOO+jdyE/mLqvqqvbogmhGxKygjpCUCG/PwSCU43+JZQ+RM+sSzkCWBcYvgF3KIAVNIoPsvXjBkzO7EdsYQ==", "dev": true, "dependencies": { - "@types/mdast": "^3.0.0", - "mdast-comment-marker": "^2.0.0", - "unified": "^10.0.0", - "unified-message-control": "^4.0.0", - "vfile": "^5.0.0" + "@types/mdast": "^4.0.0", + "mdast-comment-marker": "^3.0.0", + "unified-message-control": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-message-control/node_modules/@types/mdast": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", + "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==", + "dev": true, + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/remark-message-control/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true + }, + "node_modules/remark-message-control/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-message-control/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-message-control/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { "type": "opencollective", @@ -4717,485 +5452,6 @@ "integrity": "sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w==", "dev": true }, - "node_modules/remark-parse/node_modules/mdast-util-from-markdown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz", - "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==", - "dev": true, - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse/node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "dev": true, - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-parse/node_modules/micromark": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz", - "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-core-commonmark": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz", - "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-factory-destination": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz", - "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-factory-label": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz", - "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-factory-space": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz", - "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-factory-title": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz", - "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-factory-whitespace": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz", - "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-util-chunked": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz", - "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-util-classify-character": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz", - "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-util-combine-extensions": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz", - "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.0.tgz", - "integrity": "sha512-pIgcsGxpHEtTG/rPJRz/HOLSqp5VTuIIjXlPI+6JSDlK2oljApusG6KzpS8AF0ENUMCHlC/IBb5B9xdFiVlm5Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-util-decode-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", - "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-util-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz", - "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/remark-parse/node_modules/micromark-util-html-tag-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz", - "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/remark-parse/node_modules/micromark-util-normalize-identifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz", - "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-util-resolve-all": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz", - "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-util-sanitize-uri": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz", - "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-util-subtokenize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz", - "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/remark-parse/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/remark-parse/node_modules/micromark-util-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, "node_modules/remark-parse/node_modules/unified": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.3.tgz", @@ -5287,146 +5543,6 @@ "integrity": "sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w==", "dev": true }, - "node_modules/remark-stringify/node_modules/mdast-util-phrasing": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.0.0.tgz", - "integrity": "sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==", - "dev": true, - "dependencies": { - "@types/mdast": "^4.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify/node_modules/mdast-util-to-markdown": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz", - "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==", - "dev": true, - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "longest-streak": "^3.0.0", - "mdast-util-phrasing": "^4.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark-util-decode-string": "^2.0.0", - "unist-util-visit": "^5.0.0", - "zwitch": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify/node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "dev": true, - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify/node_modules/micromark-util-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.0.1.tgz", - "integrity": "sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/remark-stringify/node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.0.tgz", - "integrity": "sha512-pIgcsGxpHEtTG/rPJRz/HOLSqp5VTuIIjXlPI+6JSDlK2oljApusG6KzpS8AF0ENUMCHlC/IBb5B9xdFiVlm5Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/remark-stringify/node_modules/micromark-util-decode-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz", - "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/remark-stringify/node_modules/micromark-util-symbol": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz", - "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/remark-stringify/node_modules/micromark-util-types": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz", - "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, "node_modules/remark-stringify/node_modules/unified": { "version": "11.0.3", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.3.tgz", @@ -5446,19 +5562,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark-stringify/node_modules/unist-util-is": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", - "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/remark-stringify/node_modules/unist-util-stringify-position": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", @@ -5472,35 +5575,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/remark-stringify/node_modules/unist-util-visit": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", - "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/remark-stringify/node_modules/unist-util-visit-parents": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", - "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/remark-stringify/node_modules/vfile": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", @@ -5653,18 +5727,6 @@ "rimraf": "bin.js" } }, - "node_modules/sade": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", - "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", - "dev": true, - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -5744,6 +5806,16 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", @@ -5820,6 +5892,30 @@ "node": ">=8" } }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-entities/node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -5925,23 +6021,23 @@ "dev": true }, "node_modules/textlint": { - "version": "13.4.1", - "resolved": "https://registry.npmjs.org/textlint/-/textlint-13.4.1.tgz", - "integrity": "sha512-ev6XkQEUMWcW90hTHJKlvt23ca1AtmmK2iw4mazqKnSVz8PTSMg45NB68ht3ev92lIPD+8Wt4D6JxCInZkh4GQ==", + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/textlint/-/textlint-14.0.4.tgz", + "integrity": "sha512-xPQkC/BftPjizjs31wci/791EjwfN11iRLrNKiPVBogYd1r+6TnSxbCERZhgXCGcD9tEHss0kOYc0+vPEEG8jg==", "dev": true, "dependencies": { - "@textlint/ast-node-types": "^13.4.1", - "@textlint/ast-traverse": "^13.4.1", - "@textlint/config-loader": "^13.4.1", - "@textlint/feature-flag": "^13.4.1", - "@textlint/fixer-formatter": "^13.4.1", - "@textlint/kernel": "^13.4.1", - "@textlint/linter-formatter": "^13.4.1", - "@textlint/module-interop": "^13.4.1", - "@textlint/textlint-plugin-markdown": "^13.4.1", - "@textlint/textlint-plugin-text": "^13.4.1", - "@textlint/types": "^13.4.1", - "@textlint/utils": "^13.4.1", + "@textlint/ast-node-types": "^14.0.4", + "@textlint/ast-traverse": "^14.0.4", + "@textlint/config-loader": "^14.0.4", + "@textlint/feature-flag": "^14.0.4", + "@textlint/fixer-formatter": "^14.0.4", + "@textlint/kernel": "^14.0.4", + "@textlint/linter-formatter": "^14.0.4", + "@textlint/module-interop": "^14.0.4", + "@textlint/textlint-plugin-markdown": "^14.0.4", + "@textlint/textlint-plugin-text": "^14.0.4", + "@textlint/types": "^14.0.4", + "@textlint/utils": "^14.0.4", "debug": "^4.3.4", "file-entry-cache": "^5.0.1", "get-stdin": "^5.0.1", @@ -5961,7 +6057,7 @@ "textlint": "bin/textlint.js" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.14.0" } }, "node_modules/textlint-filter-rule-comments": { @@ -6017,9 +6113,9 @@ } }, "node_modules/textlint-rule-terminology": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/textlint-rule-terminology/-/textlint-rule-terminology-4.0.1.tgz", - "integrity": "sha512-wKiVhc2B9HP2MFU4x7ZDx+oM5u43ETpKWTLHKvdhPRZ0+davi4M8mFmkZVovDIMO7igsGjixikcvFmnCMg3kmQ==", + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/textlint-rule-terminology/-/textlint-rule-terminology-5.0.10.tgz", + "integrity": "sha512-+dWPNfS5F6iriG62mtfZk2zjJ85fWRemDZa8O/NM6CtdO72xpWhTYEzPCJKUVsTPE7HK57HxczmFxSRmtBkMeg==", "dev": true, "dependencies": { "lodash": "^4.17.15", @@ -6027,7 +6123,7 @@ "textlint-rule-helper": "^2.1.1" }, "engines": { - "node": ">=18" + "node": ">=20" } }, "node_modules/textlint-rule-terminology/node_modules/textlint-rule-helper": { @@ -6066,6 +6162,12 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/textlint/node_modules/@textlint/ast-node-types": { + "version": "14.0.4", + "resolved": "https://registry.npmjs.org/@textlint/ast-node-types/-/ast-node-types-14.0.4.tgz", + "integrity": "sha512-O7L1pgle030Co9ou1+6e2/6GgcIpKgqwEc0XiBabokc22Yl0QEkrf00K/usBDmSx+wo1ficWBux2mfBEF0jnDA==", + "dev": true + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6079,10 +6181,13 @@ } }, "node_modules/traverse": { - "version": "0.6.7", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.7.tgz", - "integrity": "sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg==", + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", + "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -6375,17 +6480,38 @@ } }, "node_modules/unified-message-control": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unified-message-control/-/unified-message-control-4.0.0.tgz", - "integrity": "sha512-1b92N+VkPHftOsvXNOtkJm4wHlr+UDmTBF2dUzepn40oy9NxanJ9xS1RwUBTjXJwqr2K0kMbEyv1Krdsho7+Iw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unified-message-control/-/unified-message-control-5.0.0.tgz", + "integrity": "sha512-B2cSAkpuMVVmPP90KCfKdBhm1e9KYJ+zK3x5BCa0N65zpq1Ybkc9C77+M5qwR8FWO7RF3LM5QRRPZtgjW6DUCw==", "dev": true, "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit": "^3.0.0", - "vfile": "^5.0.0", - "vfile-location": "^4.0.0", - "vfile-message": "^3.0.0" + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "space-separated-tokens": "^2.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified-message-control/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true + }, + "node_modules/unified-message-control/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", @@ -6393,14 +6519,14 @@ } }, "node_modules/unified-message-control/node_modules/unist-util-visit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-3.1.0.tgz", - "integrity": "sha512-Szoh+R/Ll68QWAyQyZZpQzZQm2UPbxibDvaY8Xc9SUtYgPsDzx5AWSk++UUt2hJuow8mvwR+rG+LQLw+KsuAKA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", "dev": true, "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^4.0.0" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" }, "funding": { "type": "opencollective", @@ -6408,13 +6534,42 @@ } }, "node_modules/unified-message-control/node_modules/unist-util-visit-parents": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-4.1.1.tgz", - "integrity": "sha512-1xAFJXAKpnnJl8G7K5KgU7FY55y3GcLIXqkzUj5QF/QVP7biUm0K0O2oqVkYsdjzJKifYeWn9+o6piAK2hGSHw==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", "dev": true, "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified-message-control/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unified-message-control/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { "type": "opencollective", @@ -6450,16 +6605,6 @@ "integrity": "sha512-nFT3frbsvTa9rrc71FJApPqXF8oIhVHbX3IWgObQi1mF7WrW48Ys70daL7o4evZUtmUf6Qn6WK0LbHhyO0hpXw==", "dev": true }, - "node_modules/unist-util-generated": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/unist-util-generated/-/unist-util-generated-2.0.1.tgz", - "integrity": "sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unist-util-inspect": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/unist-util-inspect/-/unist-util-inspect-8.0.0.tgz", @@ -6480,25 +6625,86 @@ "dev": true }, "node_modules/unist-util-is": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-5.2.1.tgz", - "integrity": "sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", + "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", "dev": true, "dependencies": { - "@types/unist": "^2.0.0" + "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, + "node_modules/unist-util-is/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true + }, "node_modules/unist-util-position": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-4.0.4.tgz", - "integrity": "sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", "dev": true, "dependencies": { - "@types/unist": "^2.0.0" + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz", + "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true + }, + "node_modules/unist-util-remove-position/node_modules/unist-util-visit": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", + "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position/node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", + "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" }, "funding": { "type": "opencollective", @@ -6518,21 +6724,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-visit": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-4.1.2.tgz", - "integrity": "sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0", - "unist-util-visit-parents": "^5.1.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/unist-util-visit-parents": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-3.1.1.tgz", @@ -6557,20 +6748,6 @@ "url": "https://opencollective.com/unified" } }, - "node_modules/unist-util-visit/node_modules/unist-util-visit-parents": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-5.1.3.tgz", - "integrity": "sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==", - "dev": true, - "dependencies": { - "@types/unist": "^2.0.0", - "unist-util-is": "^5.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -6586,33 +6763,6 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, - "node_modules/uvu": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.6.tgz", - "integrity": "sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==", - "dev": true, - "dependencies": { - "dequal": "^2.0.0", - "diff": "^5.0.0", - "kleur": "^4.0.3", - "sade": "^1.7.3" - }, - "bin": { - "uvu": "bin.js" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/uvu/node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -6640,13 +6790,61 @@ } }, "node_modules/vfile-location": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-4.1.0.tgz", - "integrity": "sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-5.0.2.tgz", + "integrity": "sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==", "dev": true, "dependencies": { - "@types/unist": "^2.0.0", - "vfile": "^5.0.0" + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location/node_modules/@types/unist": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", + "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==", + "dev": true + }, + "node_modules/vfile-location/node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location/node_modules/vfile": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz", + "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location/node_modules/vfile-message": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", + "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", + "dev": true, + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" }, "funding": { "type": "opencollective", diff --git a/package.json b/package.json index 145bb77e016..87656ee1415 100644 --- a/package.json +++ b/package.json @@ -3,22 +3,22 @@ "description": "Home Assistant Website & Documentation", "version": "1.0.0", "devDependencies": { - "remark-cli": "^12.0.0", + "remark-cli": "^12.0.1", "remark-frontmatter": "^5.0.0", - "remark-lint": "^9.1.2", - "remark-lint-fenced-code-flag": "^3.1.2", - "remark-lint-heading-increment": "^3.1.2", - "remark-lint-heading-style": "^3.1.2", - "remark-lint-no-shell-dollars": "^3.1.2", - "remark-lint-ordered-list-marker-style": "^3.1.2", - "remark-lint-ordered-list-marker-value": "^3.1.2", - "remark-lint-prohibited-strings": "^3.1.0", - "remark-lint-unordered-list-marker-style": "^3.1.2", + "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-prohibited-strings": "^4.0.0", + "remark-lint-unordered-list-marker-style": "^4.0.0", "remark-stringify": "^11.0.0", - "textlint": "^13.4.1", + "textlint": "^14.0.4", "textlint-filter-rule-comments": "^1.2.2", "textlint-rule-common-misspellings": "^1.0.1", - "textlint-rule-terminology": "^4.0.1" + "textlint-rule-terminology": "^5.0.10" }, "resolutions": { "minimist": ">=1.2.5" diff --git a/plugins/configuration.rb b/plugins/configuration.rb index a516c106346..dcf2158cee3 100644 --- a/plugins/configuration.rb +++ b/plugins/configuration.rb @@ -2,9 +2,9 @@ module Jekyll class ConfigurationBlock < Liquid::Block TYPE_LINKS = { 'action' => '/docs/scripts/', - 'device_class' => '/docs/configuration/customizing-devices/#device-class', + 'device_class' => '/integrations/homeassistant/#device-class', 'template' => '/docs/configuration/templating/', - 'icon' => '/docs/configuration/customizing-devices/#icon', + 'icon' => '/integrations/homeassistant/#icon', 'selector' => '/docs/blueprint/selectors/', } @@ -72,12 +72,12 @@ module Jekyll if attr['type'].kind_of? Array attr['type'].each do |type| raise ArgumentError, "Configuration type '#{type}' for key '#{key}' is not a valid type in the documentation."\ - " See: https://developers.home-assistant.io/docs/en/documentation_create_page.html#configuration" unless \ + " See: https://developers.home-assistant.io/docs/documenting/create-page#configuration" unless \ TYPES.include? type end else raise ArgumentError, "Configuration type '#{attr['type']}' for key '#{key}' is not a valid type in the documentation."\ - " See: https://developers.home-assistant.io/docs/en/documentation_create_page.html#configuration" unless \ + " See: https://developers.home-assistant.io/docs/documenting/create-page#configuration" unless \ TYPES.include? attr['type'] end diff --git a/plugins/site_pages.rb b/plugins/site_pages.rb new file mode 100644 index 00000000000..517f4571195 --- /dev/null +++ b/plugins/site_pages.rb @@ -0,0 +1,27 @@ +module Jekyll + class SitePagesGenerator < Jekyll::Generator + def generate(site) + all_pages = Array.new + + site.collections.each do |name, collection| + all_pages.concat(collection.docs) + end + + site.data["site_pages"] = all_pages + .concat(site.pages) + .concat(site.documents) + .map { |entry| + [ + entry.url.to_s, + { + "title" => entry["title"], + "description" => entry["description"], + "url" => entry.url, + "relative_path" => entry.relative_path + } + ] + } + .to_h + end + end +end \ No newline at end of file diff --git a/plugins/terminology_tooltip.rb b/plugins/terminology_tooltip.rb index b70b5e33075..41d50355607 100644 --- a/plugins/terminology_tooltip.rb +++ b/plugins/terminology_tooltip.rb @@ -20,6 +20,7 @@ module Jekyll end def render(context) + @term.gsub!(/\"/, "") entries = context.registers[:site].data["glossary"].select do |entry| entry.key?("term") and (@term.casecmp(entry["term"]).zero? or (entry.key?("aliases") and entry["aliases"].any?{ |s| s.casecmp(@term)==0 })) end @@ -33,7 +34,7 @@ module Jekyll if glossary.key?("link") rendered_link = Liquid::Template.parse(glossary["link"]).render(context).strip - link = "
[Learn more]" + link = "[Learn more]" end tooltip = "#{definition}#{link || ""}" diff --git a/sass/custom/_landingpage.scss b/sass/custom/_landingpage.scss index 1d15ac7a700..387a933e319 100644 --- a/sass/custom/_landingpage.scss +++ b/sass/custom/_landingpage.scss @@ -831,6 +831,18 @@ $ha__primary_color: #03a9f4; } .distributors { + details { + width: 100%; + justify-content: space-between; + padding: 16px 24px; + color: #222222; + margin: auto; + + summary.region { + display: list-item; + } + } + a { text-decoration: none; diff --git a/sass/custom/_paulus.scss b/sass/custom/_paulus.scss index 3af2fd05e58..37cc00450fa 100644 --- a/sass/custom/_paulus.scss +++ b/sass/custom/_paulus.scss @@ -490,6 +490,10 @@ article.listing { box-shadow: none; } + video { + max-width: 100%; + } + &>table, &>.entry-content>table { background-color: #f3fcf5; diff --git a/sass/custom/_terminology_tooltip.scss b/sass/custom/_terminology_tooltip.scss index fea762f43c5..348d16581db 100644 --- a/sass/custom/_terminology_tooltip.scss +++ b/sass/custom/_terminology_tooltip.scss @@ -9,6 +9,8 @@ } .terminology-tooltip { + --horizontal-move: 0px; + visibility: hidden; width: 250px; background-color: $primary-color; @@ -24,7 +26,7 @@ z-index: 1; bottom: 100%; - left: 50%; + left: calc(50% + var(--horizontal-move)); margin-left: -125px; a { @@ -32,15 +34,39 @@ font-weight: 500; } - &:after { + @mixin arrow { content: " "; position: absolute; - top: 100%; - left: 50%; + left: calc(50% - var(--horizontal-move)); margin-left: -5px; border-width: 5px; border-style: solid; + } + + &:after { + @include arrow; + + top: 100%; border-color: $primary-color transparent transparent transparent; } + + &.below { + bottom: auto; + top: 1lh; + + &:before { + @include arrow; + + top: -10px; + border-color: transparent transparent $primary-color transparent; + } + + &:after { + display: none; + } + } + } + code { + border-bottom: 2px dotted $primary-color; } } diff --git a/source/_dashboards/alarm-panel.markdown b/source/_dashboards/alarm-panel.markdown index 9d1938b50b0..6fc60fdb02a 100644 --- a/source/_dashboards/alarm-panel.markdown +++ b/source/_dashboards/alarm-panel.markdown @@ -3,9 +3,14 @@ type: card title: "Alarm panel card" sidebar_label: Alarm panel description: "The alarm panel card allows you to arm and disarm your alarm control panel integrations." +related: + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/cards/ + title: Dashboard cards --- -The alarm panel card allows you to arm and disarm your [alarm control panel](/integrations/#alarm) integrations. +The alarm panel card allows you to arm and disarm your [alarm control panel](/integrations/#alarm) {% term integrations %}.

Screenshot of the alarm panel card diff --git a/source/_dashboards/area.markdown b/source/_dashboards/area.markdown index 6d9acaa9afc..be21b487ee8 100644 --- a/source/_dashboards/area.markdown +++ b/source/_dashboards/area.markdown @@ -3,9 +3,14 @@ type: card title: "Area card" sidebar_label: Area description: "The area card gives control of your entities in a specified area." +related: + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/cards/ + title: Dashboard cards --- -The area card lets you control and monitor an individual area. +The area card lets you control and monitor an individual {% term area %}.

Screenshot of the area card @@ -16,9 +21,9 @@ The area card lets you control and monitor an individual area. All options for this card can be configured via the user interface. -Buttons will appear on the card for the entities in the area including fan, light and switch. A motion sensor icon will appear in the top left if a motion sensor is in the area and motion is detected by the motion sensor. +Buttons will appear on the card for the {% term entities %} in the area including fan, light, and switch. A motion sensor icon will appear in the top left if a motion sensor is in the area and if motion is detected by the motion sensor. -If a camera is added to the area you can show the camera feed instead of the area picture. +If a camera is added to the {% term area %} you can show the camera feed instead of the area picture. ## YAML configuration @@ -56,6 +61,16 @@ 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 +alert_classes: + required: false + type: list + default: "moisture, motion" + description: A list of binary sensor device classes which will populate alert icons in the card when the state is on. +sensor_classes: + required: false + type: list + default: "temperature, humidity" + description: A list of sensor device classes which will display their averaged sensor readings for the area. {% endconfiguration %} ### Example diff --git a/source/_dashboards/button.markdown b/source/_dashboards/button.markdown index 88ce2c1eba7..c7eed878e8c 100644 --- a/source/_dashboards/button.markdown +++ b/source/_dashboards/button.markdown @@ -3,6 +3,15 @@ type: card title: "Button card" sidebar_label: Button description: "The Button card allows you to add buttons to perform tasks." +related: + - docs: /dashboards/actions/ + title: Card actions + - docs: /docs/scripts/ + title: Scripts + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/cards/ + title: Dashboard cards --- The button card allows you to add buttons to perform tasks. diff --git a/source/_dashboards/calendar.markdown b/source/_dashboards/calendar.markdown index 18ae6b31661..940a45c7fe6 100644 --- a/source/_dashboards/calendar.markdown +++ b/source/_dashboards/calendar.markdown @@ -3,9 +3,14 @@ type: card title: "Calendar card" sidebar_label: Calendar description: "The calendar card displays your calendar entities in a month, day and list view" +related: + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/cards/ + title: Dashboard cards --- -The calendar card displays your [calendar](/integrations/#calendar) entities in a month, day and list view (7 days). +The calendar card displays your [calendar](/integrations/#calendar) {% term entities %} in a month, day, and list view (7 days).

Screenshot of the 
@@ -17,19 +22,6 @@ The calendar card displays your [calendar](/integrations/#calendar) entities in
 
 All options for this card can be configured via the user interface.
 
-## Card settings
-
-{% configuration_basic %}
-Title:
-  description: The title displayed at the top of the card.
-Initial View:
-  description: "The view that will show first when the card is loaded onto the page. Options are `Month View`, `Day View`, or `List (7 days)`."
-Entities:
-  description: The calendar entities that will be displayed in the card.
-Theme:
-  description: Name of any loaded theme to be used for this card. For more information about themes, see the [frontend documentation](/integrations/frontend/).
-{% endconfiguration_basic %}
-
 ## YAML configuration
 
 The following YAML options are available when you use YAML mode or just prefer to use YAML in the code editor in the UI.
diff --git a/source/_dashboards/conditional.markdown b/source/_dashboards/conditional.markdown
index 9c4d23f1696..276bad01362 100644
--- a/source/_dashboards/conditional.markdown
+++ b/source/_dashboards/conditional.markdown
@@ -1,8 +1,13 @@
 ---
 type: card
-title: Conditional Card
+title: Conditional card
 sidebar_label: Conditional
 description: The Conditional card displays another card based on conditions.
+related:
+  - docs: /dashboards/cards/
+    title: Dashboard cards
+  - docs: /dashboards/cards/#show-or-hide-a-card-conditionally
+    title: Conditional settings on the card -This card will allow you to pick what data to show. Changing it in this card will influence the data in all other cards. +This card allows you to pick what data to show. Changing it in this card will influence the data in all other cards. Specific dates and ranges can be selected by opening the date range picker. The current period can be compared to the previous one using the compare data option within the menu. ### Example + ```yaml type: energy-date-selection ``` @@ -35,6 +41,7 @@ The energy usage graph card shows the amount of energy your house has consumed, It will also show the amount of energy your have returned to the grid. ### Example + ```yaml type: energy-usage-graph ``` @@ -49,6 +56,7 @@ type: energy-usage-graph The solar production graph card shows the amount of energy your solar panels have produced per source, and if setup and available the forecast of the solar production. ### Example + ```yaml type: energy-solar-graph ``` @@ -97,6 +105,7 @@ If setup, it will also tell you how many kWh of the energy you got from the grid If you set `link_dashboard` to `true`, the card will include a link to the energy dashboard. ### Example + ```yaml type: energy-distribution link_dashboard: true @@ -113,6 +122,7 @@ The energy sources table card shows all your energy sources, and the correspondi If setup, it will also show the costs and compensation per source and the total. ### Example + ```yaml type: energy-sources-table ``` @@ -127,6 +137,7 @@ type: energy-sources-table The grid neutrality gauge card represents your energy dependency. If the needle is in the purple, you returned more energy to the grid than you consumed from it. If it's in the blue, you consumed more energy from the grid than you returned. ### Example + ```yaml type: energy-grid-neutrality-gauge ``` @@ -141,6 +152,7 @@ type: energy-grid-neutrality-gauge The solar consumed gauge represents how much of the solar energy was used by your home and was not returned to the grid. If you frequently return a lot, try to conserve this energy by installing a battery or buying an electric car to charge. ### Example + ```yaml type: energy-solar-consumed-gauge ``` @@ -155,6 +167,7 @@ type: energy-solar-consumed-gauge The carbon consumed gauge card represents how much of the energy consumed by your home was generated using non-fossil fuels like solar, wind and nuclear. It includes the solar energy you generated your self. ### Example + ```yaml type: energy-carbon-consumed-gauge ``` @@ -169,6 +182,7 @@ type: energy-carbon-consumed-gauge The self-sufficiency gauge represents how self-sufficient your home is. If you rely on grid imports, this value decreases. You can increase this value by adding more solar capacity or battery storage. ### Example + ```yaml type: energy-self-sufficiency-gauge ``` @@ -196,3 +210,27 @@ The following example limits the number of shown devices to 5: type: energy-devices-graph max_devices: 5 ``` + +## Detail devices energy graph + +

+ Screenshot of the devices energy graph card + Screenshot of the detail devices energy graph card. +

+ +The **Detail devices energy graph** card is similar to the **Devices energy graph** card, but shows the individual usage on a time scale. + +By default, this card will show all your devices. Optionally, the number of devices can be limited by adding the `max_devices` option and specifying the maximum number of devices to show. If there are more devices available than shown, the devices with the highest energy usage are shown. + +### Examples + +```yaml +type: energy-devices-detail-graph +``` + +The following example limits the number of shown devices to 5: + +```yaml +type: energy-devices-detail-graph +max_devices: 5 +``` diff --git a/source/_dashboards/entities.markdown b/source/_dashboards/entities.markdown index 69f74e67c5a..98cc7056db5 100644 --- a/source/_dashboards/entities.markdown +++ b/source/_dashboards/entities.markdown @@ -1,8 +1,15 @@ --- type: card -title: "Entities Card" +title: "Entities card" sidebar_label: Entities description: "The entities card is the most common type of card. It groups items together into lists." +related: + - docs: /dashboards/actions/ + title: Card actions + - docs: /dashboards/header-footer/ + title: Card header and footer + - docs: /dashboards/cards/ + title: Dashboard cards --- The entities card is the most common type of card. It groups items together into lists. It can be used to display an entity's state or attribute, but also contain buttons, web links, etc. diff --git a/source/_dashboards/entity-filter.markdown b/source/_dashboards/entity-filter.markdown index 201e7067261..64b57545829 100644 --- a/source/_dashboards/entity-filter.markdown +++ b/source/_dashboards/entity-filter.markdown @@ -29,9 +29,13 @@ entities: required: true description: A list of entity IDs or `entity` objects, see below. type: list +conditions: + required: false + description: List of conditions to check. See [available conditions](#conditions-options).* + type: list state_filter: - required: true - description: List of strings representing states or `filter` objects, see below. + required: false + description: (legacy) List of strings representing states or filters to check. See [available legacy filters](#legacy-state-filters).* type: list card: required: false @@ -45,6 +49,8 @@ show_empty: default: true {% endconfiguration %} +*one is required (`conditions` or `state_filter`) + ### Options for entities If you define entities as objects instead of strings (by adding `entity:` before entity ID), you can add more customization and configurations: @@ -64,8 +70,9 @@ name: type: string icon: required: false - description: Overwrites icon or entity picture. + description: Overwrites icon or entity picture. You can use any icon from [Material Design Icons](https://pictogrammers.com/library/mdi/). Prefix the icon name with `mdi:`, ie `mdi:home`. type: string + default: Entity domain icon secondary_info: required: false description: "Show additional info. Values: `entity-id`, `last-changed`." @@ -74,32 +81,225 @@ format: required: false description: "How the state should be formatted. Currently only used for timestamp sensors. Valid values are: `relative`, `total`, `date`, `time` and `datetime`." type: string +conditions: + required: false + description: List of conditions to check. See [available conditions](#conditions-options).* + type: list state_filter: required: false - description: List of strings representing states or `filter` objects, see below. + description: (legacy) List of strings representing states or filters to check. See [available legacy filters](#legacy-state-filters).* type: list {% endconfiguration %} -### Options for state filter +*only one filter will be applied: `conditions` or `state_filter` if `conditions` is not present -If you define `state_filter` as objects instead of strings (by adding `value:` before your state value), you can add more customization to your filter: +## Conditions options -{% configuration %} -value: +You can specify multiple `conditions`, in which case the entity will be displayed if it matches any condition. + +### State + +Tests if an entity has a specified state. + +```yaml +type: entity-filter +entities: + - climate.thermostat_living_room + - climate.thermostat_bed_room +conditions: + - condition: state + state: heat +``` + +```yaml +type: entity-filter +entities: + - climate.thermostat_living_room + - climate.thermostat_bed_room +conditions: + - condition: state + state_not: "off" +``` + +```yaml +type: entity-filter +entities: + - sensor.gas_station_1 + - sensor.gas_station_2 + - sensor.gas_station_3 +conditions: + - condition: state + state: sensor.gas_station_lowest_price +``` + +{% configuration condition_state %} +condition: required: true - description: String representing the state. + description: "`state`" type: string -operator: +state: required: false - description: Operator to use in the comparison. Can be `==`, `<=`, `<`, `>=`, `>`, `!=`, `in`, `not in`, or `regex`. + description: Entity state or ID to be equal to this value. Can contain an array of states.* + type: [list, string] +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] +{% endconfiguration %} + +*one is required (`state` or `state_not`) + +### Numeric state + +Tests if an entity state matches the thresholds. + +```yaml +type: entity-filter +entities: + - sensor.outside_temperature + - sensor.living_room_temperature + - sensor.bed_room_temperature +conditions: + - condition: numeric_state + above: 10 + below: 20 +``` + +{% configuration condition_numeric_state %} +condition: + required: true + description: "`numeric_state`" type: string -attribute: +above: required: false - description: Attribute of the entity to use instead of the state. + description: Entity state or ID to be above this value.* + type: string +below: + required: false + description: Entity state or ID to be below this value.* type: string {% endconfiguration %} -## Examples +*at least one is required (`above` or `below`), both are also possible for values between. + +### Screen + +Specify the visibility of the entity per screen size. Some screen size presets are available in the UI but you can use any CSS media query you want in YAML. + +```yaml +type: entity-filter +entities: + - sensor.outside_temperature + - sensor.living_room_temperature + - sensor.bed_room_temperature +conditions: + - condition: screen + media_query: "(min-width: 1280px)" +``` + +{% configuration condition_screen %} +condition: + required: true + description: "`screen`" + type: string +media_query: + required: true + description: Media query to check which screen size are allowed to display the entity. + type: string +{% endconfiguration %} + +### User + +Specify the visibility of the entity per user. + +```yaml +type: entity-filter +entities: + - sensor.outside_temperature + - sensor.living_room_temperature + - sensor.bed_room_temperature +conditions: + - condition: user + users: + - 581fca7fdc014b8b894519cc531f9a04 +``` + +{% configuration condition_user %} +condition: + required: true + description: "`user`" + type: string +users: + required: true + description: User ID that can see the entity (unique hex value found on the Users configuration page). + type: list +{% endconfiguration %} + +### And + +Specify that both conditions must be met. + +```yaml +type: entity-filter +entities: + - sensor.outside_temperature + - sensor.living_room_temperature + - sensor.bed_room_temperature +conditions: + - condition: and + conditions: + - condition: numeric_state + above: 0 + - condition: user + users: + - 581fca7fdc014b8b894519cc531f9a04 +``` + +{% configuration condition_and %} +condition: + required: true + description: "`and`" + type: string +conditions: + required: false + description: List of conditions to check. See [available conditions](#conditions-options). + type: list +{% endconfiguration %} + +### Or + +Specify that at least one of the conditions must be met. + +```yaml +type: entity-filter +entities: + - sensor.outside_temperature + - sensor.living_room_temperature + - sensor.bed_room_temperature +conditions: + - condition: or + conditions: + - condition: numeric_state + above: 0 + - condition: user + users: + - 581fca7fdc014b8b894519cc531f9a04 +``` + +{% configuration condition_or %} +condition: + required: true + description: "`or`" + type: string +conditions: + required: false + description: List of conditions to check. See [available conditions](#conditions-options). + type: list +{% endconfiguration %} + +## Legacy state filters + +### String filter Show only active switches or lights in the house. @@ -134,7 +334,32 @@ card: Entity filter combined with glance card.

-You can also specify multiple `state_filter` conditions, in which case the entity will be displayed if it matches any condition. This example will display everyone who is at home or at work. +You can also specify multiple `state_filter` conditions, in which case the entity will be displayed if it matches any condition. + +If you define `state_filter` as objects instead of strings, you can add more customization to your filter, as described below. + +### Operator filter + +Tests if an entity state correspond to the applied `operator`. + +{% configuration condition_operator %} +value: + required: true + description: String representing the state. + type: string +operator: + required: true + description: Operator to use in the comparison. Can be `==`, `<=`, `<`, `>=`, `>`, `!=`, `in`, `not in`, or `regex`. + type: string +attribute: + required: false + description: Attribute of the entity to use instead of the state. + type: string +{% endconfiguration %} + +#### Examples + +Displays everyone who is at home or at work. ```yaml type: entity-filter @@ -146,7 +371,7 @@ state_filter: - operator: "==" value: home - operator: "==" - value: work + value: work card: type: glance title: Who's at work or home @@ -173,19 +398,19 @@ entities: Use a regex filter against entity attributes. This regex filter below looks for expressions that are 1 digit in length and where the number is between 0-7 (so show holidays today or in the next 7 days) and displays those holidays as entities in the Entity Filter card. ```yaml - - type: entity-filter - card: - title: "Upcoming Holidays In Next 7 Days" - show_header_toggle: false - state_filter: - - operator: regex - value: "^([0-7]{1})$" - attribute: eta - entities: - - entity: sensor.upcoming_ical_holidays_0 - - entity: sensor.upcoming_ical_holidays_1 - - entity: sensor.upcoming_ical_holidays_2 - - entity: sensor.upcoming_ical_holidays_3 - - entity: sensor.upcoming_ical_holidays_4 - show_empty: false +type: entity-filter +card: + title: "Upcoming Holidays In Next 7 Days" + show_header_toggle: false +state_filter: + - operator: regex + value: "^([0-7]{1})$" + attribute: eta +entities: + - entity: sensor.upcoming_ical_holidays_0 + - entity: sensor.upcoming_ical_holidays_1 + - entity: sensor.upcoming_ical_holidays_2 + - entity: sensor.upcoming_ical_holidays_3 + - entity: sensor.upcoming_ical_holidays_4 +show_empty: false ``` diff --git a/source/_dashboards/entity.markdown b/source/_dashboards/entity.markdown index c095ded88c1..12e77a61dac 100644 --- a/source/_dashboards/entity.markdown +++ b/source/_dashboards/entity.markdown @@ -3,6 +3,13 @@ type: card title: "Entity card" sidebar_label: Entity description: "The entity card gives you a quick overview of your entity's state" +related: + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/header-footer/ + title: Card header and footer + - docs: /dashboards/cards/ + title: Dashboard cards --- The entity card gives you a quick overview of your entity's state. diff --git a/source/_dashboards/gauge.markdown b/source/_dashboards/gauge.markdown index 3a738f87fc8..96109181545 100644 --- a/source/_dashboards/gauge.markdown +++ b/source/_dashboards/gauge.markdown @@ -1,8 +1,13 @@ --- type: card -title: "Gauge Card" +title: "Gauge card" sidebar_label: Gauge description: "The gauge card is a basic card that allows visually seeing sensor data." +related: + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/cards/ + title: Dashboard cards --- The gauge card is a basic card that allows visually seeing sensor data. @@ -97,6 +102,18 @@ segments: required: false description: Label of the segment. This will be shown instead of the value. type: string +tap_action: + required: false + description: Action taken on card tap. See [action documentation](/dashboards/actions/#tap-action). + type: map +hold_action: + required: false + description: Action taken on card tap and hold. See [action documentation](/dashboards/actions/#hold-action). + type: map +double_tap_action: + required: false + description: Action taken on card double tap. See [action documentation](/dashboards/actions/#double-tap-action). + type: map {% endconfiguration %} ### Examples diff --git a/source/_dashboards/glance.markdown b/source/_dashboards/glance.markdown index 77319525283..bdf2f0aa8c0 100644 --- a/source/_dashboards/glance.markdown +++ b/source/_dashboards/glance.markdown @@ -3,6 +3,13 @@ type: card title: "Glance card" sidebar_label: Glance description: "The glance card is useful to group multiple sensors in a compact overview." +related: + - docs: /dashboards/actions/ + title: Card actions + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/cards/ + title: Dashboard cards --- The glance card is useful to group multiple sensors in a compact overview. Keep in mind that this can be used together with [entity-filter](/dashboards/entity-filter/) cards to create dynamic cards. diff --git a/source/_dashboards/grid.markdown b/source/_dashboards/grid.markdown index bb0fee77676..706f93d0a13 100644 --- a/source/_dashboards/grid.markdown +++ b/source/_dashboards/grid.markdown @@ -3,6 +3,11 @@ type: card title: "Grid card" sidebar_label: Grid description: "The grid card allows you to show multiple cards in a grid." +related: + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/cards/ + title: Dashboard cards --- The grid card allows you to show multiple cards in a grid. It will first fill the columns, automatically adding new rows as needed. @@ -70,7 +75,7 @@ square: false cards: - type: picture-entity entity: group.all_lights - image: /local/house.png + image: /local/house.png - type: horizontal-stack cards: - type: picture-entity diff --git a/source/_dashboards/history-graph.markdown b/source/_dashboards/history-graph.markdown index 924956d7cf2..1a21bca39d7 100644 --- a/source/_dashboards/history-graph.markdown +++ b/source/_dashboards/history-graph.markdown @@ -3,6 +3,11 @@ type: card title: "History graph card" sidebar_label: History graph description: "The history graph card allows you to display a graph for each of the entities listed." +related: + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/cards/ + title: Dashboard cards --- The history graph card allows you to display a graph for each of up to eight entities. @@ -19,7 +24,7 @@ Screenshot of the history graph card, when the sensor has a `unit_of_measurement {% include dashboard/edit_dashboard.md %} -All options for this card can be configured via the user interface. +Only the y-axis and logarithmic scale settings can be configured via the user interface. To configure the other options for this card, you need to edit the YAML configuration. ## YAML configuration @@ -53,6 +58,19 @@ 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 {% endconfiguration %} ### Options for entities diff --git a/source/_dashboards/horizontal-stack.markdown b/source/_dashboards/horizontal-stack.markdown index ecf71a94c73..ed211f7782d 100644 --- a/source/_dashboards/horizontal-stack.markdown +++ b/source/_dashboards/horizontal-stack.markdown @@ -3,6 +3,9 @@ type: card title: "Horizontal stack card" sidebar_label: Horizontal stack description: "The horizontal stack card allows you to stack together multiple cards, so they always sit next to each other in the space of one column." +related: + - docs: /dashboards/cards/ + title: Dashboard cards --- The horizontal stack card allows you to stack together multiple cards, so they always sit next to each other in the space of one column. diff --git a/source/_dashboards/humidifier.markdown b/source/_dashboards/humidifier.markdown index 8b7d4bdd4ec..759f74b357e 100644 --- a/source/_dashboards/humidifier.markdown +++ b/source/_dashboards/humidifier.markdown @@ -3,6 +3,11 @@ type: card title: "Humidifier card" sidebar_label: Humidifier description: "The humidifier card gives control of your humidifier entity, allowing you to change the target humidity and mode of the entity." +related: + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/cards/ + title: Dashboard cards --- The humidifier card lets you control and monitor humidifiers, dehumidifiers, and hygrostat devices. @@ -56,3 +61,4 @@ type: humidifier entity: humidifier.bedroom name: Bedroom Humidifier ``` + diff --git a/source/_dashboards/iframe.markdown b/source/_dashboards/iframe.markdown index fdaa049ed41..b3d4df4d99d 100644 --- a/source/_dashboards/iframe.markdown +++ b/source/_dashboards/iframe.markdown @@ -3,10 +3,17 @@ type: card title: "Webpage card" sidebar_label: Webpage description: "The webpage card allows you to embed your favorite webpage right into Home Assistant." +related: + - docs: /dashboards/dashboards/#webpage-dashboard + title: Webpage dashboard + - docs: /dashboards/cards/ + title: Dashboard cards --- The webpage card allows you to embed your favorite webpage right into Home Assistant. You can also embed files stored in your `/www` folder and reference them using `/local/`. +The webpage card is used on the [Webpage dashboard](/dashboards/dashboards/#webpage-dashboard). +

Windy weather radar as Webpage Windy weather radar as webpage. @@ -16,6 +23,7 @@ The webpage card allows you to embed your favorite webpage right into Home Assis All options for this card can be configured via the user interface. +Note that not every webpage can be embedded due to security restrictions that some sites have in place. These restrictions are enforced by your browser and prevent embedding them into a Home Assistant dashboard.

You can't embed sites using HTTP if you are using HTTPS for your Home Assistant.
@@ -47,6 +55,11 @@ title: required: false description: The card title. type: string +allow: + required: false + 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" {% endconfiguration %} ### Examples diff --git a/source/_dashboards/light.markdown b/source/_dashboards/light.markdown index f1cd3c965b5..006bb3ccc82 100644 --- a/source/_dashboards/light.markdown +++ b/source/_dashboards/light.markdown @@ -3,6 +3,13 @@ type: card title: "Light card" sidebar_label: Light description: "The light card allows you to change the brightness of the light." +related: + - docs: /dashboards/actions/ + title: Card actions + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/cards/ + title: Dashboard cards --- The light card allows you to change the brightness of the light. diff --git a/source/_dashboards/logbook.markdown b/source/_dashboards/logbook.markdown index d4fdabb5c5e..8f86938ebd3 100644 --- a/source/_dashboards/logbook.markdown +++ b/source/_dashboards/logbook.markdown @@ -3,6 +3,11 @@ type: card title: "Logbook card" sidebar_label: Logbook description: "The logbook card displays entries from the logbook for specific entities." +related: + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/cards/ + title: Dashboard cards --- The logbook card displays entries from the logbook for specific entities. diff --git a/source/_dashboards/map.markdown b/source/_dashboards/map.markdown index ed3f48e4c98..921b720db6a 100644 --- a/source/_dashboards/map.markdown +++ b/source/_dashboards/map.markdown @@ -3,9 +3,16 @@ type: card title: "Map card" sidebar_label: Map description: "The map card that allows you to display entities on a map" +related: + - docs: /dashboards/dashboards/#map-dashboard + title: Map dashboard + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/cards/ + title: Dashboard cards --- -The map card that allows you to display entities on a map +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.

Screenshot of the map card @@ -56,11 +63,11 @@ default_zoom: description: The default zoom level of the map. type: integer default: 14 (or whatever zoom level is required to fit all visible markers) -dark_mode: +theme_mode: required: false - description: Enable a dark theme for the map. - type: boolean - default: false + description: 'Override the theme to force the map to display in either a light mode (`theme_mode: light`) or a dark mode (`theme_mode: dark`). Default (`theme_mode: auto`) will follow the theme settings.' + type: string + default: 'auto' hours_to_show: required: false description: Shows a path of previous locations. Hours to show as path on the map. @@ -134,3 +141,4 @@ entities: focus: false hours_to_show: 48 ``` + diff --git a/source/_dashboards/markdown.markdown b/source/_dashboards/markdown.markdown index f1886128004..d6145a082b2 100644 --- a/source/_dashboards/markdown.markdown +++ b/source/_dashboards/markdown.markdown @@ -3,6 +3,11 @@ type: card title: "Markdown card" sidebar_label: Markdown description: "The Markdown card is used to render Markdown" +related: + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/cards/ + title: Dashboard cards --- The Markdown card is used to render [Markdown](https://commonmark.org/help/). diff --git a/source/_dashboards/masonry.markdown b/source/_dashboards/masonry.markdown index 76615e5cd52..6bbf31ccef2 100644 --- a/source/_dashboards/masonry.markdown +++ b/source/_dashboards/masonry.markdown @@ -2,11 +2,29 @@ type: view title: Masonry view sidebar_label: Masonry (default) -description: "The default panel layout uses a masonry algorithme." +description: "The default panel layout uses a masonry algorithm." +related: + - docs: /dashboards/panel/ + title: Panel view + - docs: /dashboards/sidebar/ + title: Sidebar view --- The masonry view is the default view type. -It sorts cards in columns based on their `card size`. If you want to group some cards you have to use `stack` or `grid` cards. + +

+Screenshot of the masonry view +Screenshot of the masonry view. +

+ +Masonry sorts cards in columns based on their card size. The next card is placed below the smallest card on the dashboard. + +

+Image showing how masonry arranges cards based on size. +Masonry arranges cards based on size. +

+ +To group cards, you have to use [horizontal stack](/dashboards/horizontal-stack/), [vertical stack](/dashboards/vertical-stack/), or [grid](/dashboards/grid/) cards. {% configuration %} type: diff --git a/source/_dashboards/media-control.markdown b/source/_dashboards/media-control.markdown index 0ba077b45e7..cc620cf0cc7 100644 --- a/source/_dashboards/media-control.markdown +++ b/source/_dashboards/media-control.markdown @@ -3,6 +3,11 @@ type: card title: "Media control card" sidebar_label: Media control description: "The media control card is used to display media player entities on an interface with easy to use controls." +related: + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/cards/ + title: Dashboard cards --- The media control card is used to display [media player](/integrations/#media-player) entities on an interface with easy to use controls. diff --git a/source/_dashboards/panel.markdown b/source/_dashboards/panel.markdown index 8cc91c122f0..5b98a449016 100644 --- a/source/_dashboards/panel.markdown +++ b/source/_dashboards/panel.markdown @@ -3,13 +3,23 @@ type: view title: Panel view sidebar_label: Panel description: "The panel view shows a single card in the full width of the screen." +related: + - docs: /dashboards/masonry/ + title: Masonry view + - docs: /dashboards/sidebar/ + title: Sidebar view --- -The view must have exactly one card. This card is rendered full-width. +The panel view must have exactly one card. This card is rendered full-width. + +

+Screenshot of the panel view +Screenshot of the panel view. +

This view doesn't have support for badges. -This view is good when using cards like `map`, `stack` or `picture-elements`. +This view is good when using cards like [map](/dashboards/map/), [horizontal stack](/dashboards/horizontal-stack/), [vertical stack](/dashboards/vertical-stack/), [picture elements](/dashboards/picture-elements/), or [picture glance](/dashboards/picture-glance/). {% configuration %} type: diff --git a/source/_dashboards/picture-elements.markdown b/source/_dashboards/picture-elements.markdown index b494e2810dc..cdfacbf3b58 100644 --- a/source/_dashboards/picture-elements.markdown +++ b/source/_dashboards/picture-elements.markdown @@ -3,6 +3,13 @@ type: card title: "Picture elements card" sidebar_label: Picture elements description: "The picture elements card is one of the most versatile types of cards. The cards allow you to position icons or text and even services! On an image based on coordinates." +related: + - docs: /dashboards/actions/ + title: Card actions + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/cards/ + title: Dashboard cards --- The picture elements card is one of the most versatile types of cards. @@ -401,7 +408,7 @@ user: type: string {% endconfiguration %} -## Notes on Element Attributes +## Notes on element attributes ### How to use the style object diff --git a/source/_dashboards/picture-entity.markdown b/source/_dashboards/picture-entity.markdown index e3f14b9eecc..aee7b651390 100644 --- a/source/_dashboards/picture-entity.markdown +++ b/source/_dashboards/picture-entity.markdown @@ -3,6 +3,13 @@ type: card title: Picture entity card sidebar_label: Picture entity description: The picture entity card displays an entity in the form of an image. Instead of images from URL, it can also show the picture of camera entities. +related: + - docs: /dashboards/actions/ + title: Card actions + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/cards/ + title: Dashboard cards --- The picture entity card displays an entity in the form of an image. Instead of images from URL, it can also show the picture of `camera` entities. @@ -12,7 +19,7 @@ The picture entity card displays an entity in the form of an image. Instead of i Background changes according to the entity state.

-{% include dashboard/edit_dashboard.md %} +{% include dashboard/add_picture_to_card.md %} ## YAML configuration @@ -137,4 +144,5 @@ tap_action: {% endraw %} -The filename needs to be a path that is writable by Home Assistant in your system. You may need to configure `allowlist_external_dirs` ([documentation](/docs/configuration/basic/)). +The filename needs to be a path that is writable by Home Assistant in your system. You may need to configure `allowlist_external_dirs` ([documentation](/integrations/homeassistant/#allowlist_external_dirs)). + diff --git a/source/_dashboards/picture-glance.markdown b/source/_dashboards/picture-glance.markdown index c3a55842b14..5afbb59fb3a 100644 --- a/source/_dashboards/picture-glance.markdown +++ b/source/_dashboards/picture-glance.markdown @@ -3,6 +3,13 @@ type: card title: "Picture glance card" sidebar_label: Picture glance description: "The picture glance card shows an image and corresponding entity states as an icon. The entities on the right side allow toggle actions, others show the more information dialog." +related: + - docs: /dashboards/actions/ + title: Card actions + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/cards/ + title: Dashboard cards --- The picture glance card shows an image and lets you place small icons of entity states on top of that card to control those entities from there. In the image below: the entities on the right allow toggle actions, the others show the more information dialog. @@ -12,7 +19,7 @@ The picture glance card shows an image and lets you place small icons of entity Picture glance card for a living room.

-{% include dashboard/edit_dashboard.md %} +{% include dashboard/add_picture_to_card.md %} ## YAML configuration diff --git a/source/_dashboards/picture.markdown b/source/_dashboards/picture.markdown index 5a2fca27cc0..7fade859a72 100644 --- a/source/_dashboards/picture.markdown +++ b/source/_dashboards/picture.markdown @@ -1,8 +1,15 @@ --- type: card -title: "Picture Card" +title: "Picture card" sidebar_label: Picture description: "The picture card allows you to set an image to use for navigation to various paths in your interface or to call a service." +related: + - docs: /dashboards/actions/ + title: Card actions + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/cards/ + title: Dashboard cards --- The picture card allows you to set an image to use for navigation to various paths in your interface or to call a service. @@ -12,7 +19,7 @@ The picture card allows you to set an image to use for navigation to various pat Screenshot of the picture card.

-{% include dashboard/edit_dashboard.md %} +{% include dashboard/add_picture_to_card.md %} ## YAML configuration diff --git a/source/_dashboards/plant-status.markdown b/source/_dashboards/plant-status.markdown index 031def93771..a989dc0ee50 100644 --- a/source/_dashboards/plant-status.markdown +++ b/source/_dashboards/plant-status.markdown @@ -3,6 +3,11 @@ type: card title: "Plant status card" sidebar_label: Plant status description: "The plant status card is for all the lovely botanists out there." +related: + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/cards/ + title: Dashboard cards --- The plant status card is for all the lovely botanists out there. diff --git a/source/_dashboards/sections.markdown b/source/_dashboards/sections.markdown new file mode 100644 index 00000000000..c3ce04b8d17 --- /dev/null +++ b/source/_dashboards/sections.markdown @@ -0,0 +1,112 @@ +--- +type: view +title: Sections (experimental) +sidebar_label: Sections (experimental) +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: + - docs: /dashboards/masonry/ + title: Masonry view + - docs: /dashboards/sidebar/ + title: Sidebar view + - docs: /dashboards/panel/ + title: Panel view + - docs: /blog/2024/03/04/dashboard-chapter-1/ + title: Dashboard chapter 1 blog post + - docs: /dashboards/cards/#adding-cards-to-your-dashboard + title: Adding cards to a view + - docs: /dashboards/views/#adding-a-view-to-a-dashboard + title: Adding a new view +--- + +The sections view lets you organize your cards in sections on a grid. +You can group cards without using horizontal or vertical stack cards. + +

+ A fully populated dashboard in Sections view layout + A fully populated dashboard in Sections view layout +

+ +
+

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.


It is not possible to migrate dashboards into sections view.

+
+ +## 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**. + - You are now presented with a new, empty view. + - If you chose a background image, the page is filled with that image. + +## 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. + +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) + +2. To add a new section, select the **Create section** button. +3. To edit the section title, select the Edit icon button. + - If you leave the section title empty, this line will be hidden. +4. If you want this section to be visible only to specific users or under a certain condition, you can define those conditions: + - On the **Visibility** tab, select **Add condition**. + - 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 pencil icon. +2. Open the view with the section you want to delete. +3. Select the Delete icon button. + +## Rearranging sections and cards + +In the sections view, you can rearrange sections and cards by dragging them to a new location. This is not yet possible in other views. + +1. To edit your dashboard, in the top right corner, select the pencil icon. +2. To rearrange sections, hold the Move icon button and move the card. + +

+ Rearranging sections by dragging + Rearranging sections by dragging +

+ +3. To rearrange cards, tap and hold the card and move it to your desired location. + +

+ Rearranging cards by dragging + Rearranging cards by dragging +

+ +## Show or hide section conditionally + +You can choose to show or hide certain sections based on different conditions. The [available conditions](/dashboards/conditional/#card-conditions) are the same as that for the conditional card. + +To edit the section visibility conditions, select the Edit icon button and then click on the visibility tab. + +## Check out the demo + +Check out the demo from the March live stream on dashboards. + + + +## About the sections view layout + +To learn all about the design decisions and the grid layout used for the sections view, refer to the [Dashboard chapter 1 blog post](/blog/2024/03/04/dashboard-chapter-1/). + +## YAML configuration + +{% configuration %} +type: + required: false + description: "`sections`" + type: string +{% endconfiguration %} diff --git a/source/_dashboards/sensor.markdown b/source/_dashboards/sensor.markdown index 5769fb7f787..ae181701ce7 100644 --- a/source/_dashboards/sensor.markdown +++ b/source/_dashboards/sensor.markdown @@ -3,6 +3,11 @@ type: card title: "Sensor card" sidebar_label: Sensor description: "The sensor card gives you a quick overview of your sensors state with an optional graph to visualize change over time." +related: + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/cards/ + title: Dashboard cards --- The sensor card gives you a quick overview of your sensors state with an optional graph to visualize change over time. diff --git a/source/_dashboards/shopping-list.markdown b/source/_dashboards/shopping-list.markdown index 0c6e77eac83..fd4061f6838 100644 --- a/source/_dashboards/shopping-list.markdown +++ b/source/_dashboards/shopping-list.markdown @@ -1,10 +1,16 @@ --- -type: card title: "Shopping list card" -sidebar_label: Shopping list description: "The shopping list card allows you to add, edit, check-off, and clear items from your shopping list." +description: "The panel view shows a single card in the full width of the screen." +related: + - docs: /integrations/todo/ + title: To-do list integration + - docs: /integrations/local_todo/ + title: Local to-do integration --- +Note: the shopping list card is no longer available as a card to add from the user interface. Use the [to-do list card](/dashboards/todo-list/) instead. + The shopping list card allows you to add, edit, check-off, and clear items from your shopping list.

@@ -39,7 +45,7 @@ theme: ### Examples -Title Example: +Title example: ```yaml type: shopping-list diff --git a/source/_dashboards/sidebar.markdown b/source/_dashboards/sidebar.markdown index bfa851b9392..47815a9e52d 100644 --- a/source/_dashboards/sidebar.markdown +++ b/source/_dashboards/sidebar.markdown @@ -3,18 +3,30 @@ type: view title: Sidebar view sidebar_label: Sidebar description: "The sidebar view has 2 columns, a wide one and a smaller one on the right." +related: + - docs: /dashboards/masonry/ + title: Masonry view + - docs: /dashboards/panel/ + title: Panel view --- The sidebar view has 2 columns, a wide one and a smaller one on the right. +

+Screenshot of the sidebar view +Screenshot of the sidebar view used for the energy dashboard. +

+ This view doesn't have support for badges. -To change a view to edit mode, or to change the location of a card, enable edit mode: -Click the menu (three dots at the top right of the screen) and then **Edit Dashboard**. +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. -You can set if a card should be placed in the main (left) column of the sidebar column (right), by pressing the arrow right or left arrow in the bar underneath the card. +

+Screenshot showing how to move a card between sidebar and main view +Screenshot showing how to move a card between sidebar and main view. +

-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 of the cards in the config. ## View config: @@ -46,4 +58,4 @@ cards: - media_player.lounge_room view_layout: position: sidebar -``` +``` \ No newline at end of file diff --git a/source/_dashboards/statistic.markdown b/source/_dashboards/statistic.markdown index 8e34f583fa9..e7d03df5ebf 100644 --- a/source/_dashboards/statistic.markdown +++ b/source/_dashboards/statistic.markdown @@ -3,6 +3,11 @@ type: card title: "Statistic card" sidebar_label: Statistic description: "The statistic card allows you to display a statistical value for an entity." +related: + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/cards/ + title: Dashboard cards --- The statistic card allows you to display a statistical value for an entity. @@ -171,4 +176,4 @@ period: minutes: -20 seconds: -10 stat_type: change -``` \ No newline at end of file +``` diff --git a/source/_dashboards/statistics-graph.markdown b/source/_dashboards/statistics-graph.markdown index 324fc602bf8..52a69b301be 100644 --- a/source/_dashboards/statistics-graph.markdown +++ b/source/_dashboards/statistics-graph.markdown @@ -3,6 +3,11 @@ type: card title: "Statistics graph card" sidebar_label: Statistics graph description: "The statistics graph card allows you to display a graph with statistics data for each of the entities listed." +related: + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/cards/ + title: Dashboard cards --- The statistics graph card allows you to display a graph of statistics data for each of the entities listed. @@ -17,7 +22,7 @@ Screenshot of the statistics graph card with none metered entities and `chart_ty Screenshot of the statistics graph card with a metered entity and `chart_type` `bar`.

-Statistics are gathered every 5 minutes for sensors that support it. It will either keep the `min`, `max`, and `mean` of a sensor's value for a specific hour or the `sum` for a metered entity. +Statistics are gathered every 5 minutes and also hourly for sensors that support it. The 5-minute statistics will be retained for the duration set in the [recorder configuration](/integrations/recorder/#purge_keep_days), and hourly statistics will be retained indefinitely. It will either keep the `min`, `max`, and `mean` of a sensor's value for a specific hour or the `sum` for a metered entity. If your sensor doesn't work with statistics, check [this](/more-info/statistics/). diff --git a/source/_dashboards/thermostat.markdown b/source/_dashboards/thermostat.markdown index 67b4d40cbf4..240a89bbc80 100644 --- a/source/_dashboards/thermostat.markdown +++ b/source/_dashboards/thermostat.markdown @@ -3,9 +3,14 @@ type: card title: "Thermostat card" sidebar_label: Thermostat description: "The thermostat card gives control of your climate entity, allowing you to change the temperature and mode of the entity." +related: + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/cards/ + title: Dashboard cards --- -The thermostat card gives control of your [climate](/integrations/#climate) entity, allowing you to change the temperature and mode of the entity. +The thermostat card gives control of your [climate](/integrations/#climate) {% term entity %}, allowing you to change the temperature and mode of the {% term entity %}.

Screenshot of the thermostat card diff --git a/source/_dashboards/tile.markdown b/source/_dashboards/tile.markdown index cc3e80d2aef..d950c0df9ae 100644 --- a/source/_dashboards/tile.markdown +++ b/source/_dashboards/tile.markdown @@ -3,9 +3,16 @@ type: card title: "Tile card" sidebar_label: Tile description: "The tile card gives you a quick overview of your entity. The card allows you to toggle the entity, show the more-info dialog, or custom actions." +related: + - docs: /dashboards/actions/ + title: Card actions + - docs: /dashboards/features/ + title: Card features + - docs: /dashboards/cards/ + title: Dashboard cards --- -The tile card gives you a quick overview of your entity. The card allows you to toggle the entity and show the more info dialog. A badge is shown for some entities like the [climate](/integrations/climate) or [person](/integrations/person) entities. +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 %}.

Screenshot of tile cards @@ -33,7 +40,7 @@ icon: type: string color: required: false - description: Set the color when the entity is active. By default, the color is based on `state`, `domain`, and `device_class` of your entity. It accepts [color token](/dashboards/tile/#available-color-tokens) or hex color code. + description: Set the color when the entity is active. By default, the color is based on `state`, `domain`, and `device_class` of your entity. It accepts [color token](/dashboards/tile/#available-colors) or hex color code. type: string default: state show_entity_picture: @@ -126,6 +133,19 @@ features: - return_home ``` -## Available color tokens +## Available colors -Some color tokens are available to colorize the tile card : `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`. \ No newline at end of file +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 you’d +like to see, they may not be in the desired order. + +For your thermostat, that means you can reorder the HVAC modes or presets. + +

+  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. +

diff --git a/source/_dashboards/todo-list.markdown b/source/_dashboards/todo-list.markdown new file mode 100644 index 00000000000..846d6cfd7f2 --- /dev/null +++ b/source/_dashboards/todo-list.markdown @@ -0,0 +1,74 @@ +--- +type: card +title: "To-do list card" +sidebar_label: To-do list +description: "The to-do list card allows you to add, edit, check-off, and clear items from your to-do list." +related: + - docs: /dashboards/dashboards/ + title: Dashboards + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/cards/ + title: Dashboard cards + - docs: /integrations/todo + title: To-do list integration documentation + - docs: /integrations/#to-do-list + title: List of to-do list integrations + - docs: /integrations/local_todo/ + title: Local to-do integration +--- + +The to-do list card allows you to add, edit, check-off, and clear items from your to-do list. + +

+Screenshot of the to-do list card +Screenshot of the to-do list card. +

+ +## Adding a to-do list card + +1. [Add the card using the Add card button](/dashboards/cards/#adding-cards-to-your-dashboard). + - In the **By card** dialog, select the **To-do list** card. +2. In the **Entity** dropdown menu, select your list type. + - If it is your first time working with to-do lists, there is only **Shopping list** in the menu. + - This comes from the [shopping list integration](/integrations/shopping_list/), which is installed by default. + - This is the same **Shopping list** as the one on the **To-do list** dashboard (accessible via sidebar). + ![To-do card, list entities](/images/dashboards/cards-todo.png). +3. The to-do list card can display lists from different [to-do list](/integrations/#to-do-list) integrations, such as **Bring!** or **Todoist**. + - If you don't see your desired to-do list entity, you need to add its integration first. + - Once you've added a to-do list integration, the lists are also available on the to-do list dashboard. + +## YAML configuration + +All options for this card can be configured via the user interface. + +The following YAML options are available when you use YAML mode or just prefer to use YAML in the code editor in the UI. + +{% configuration %} +type: + required: true + description: "`todo-list`" + type: string +entity: + required: true + description: The to-do entity to show + type: string +title: + required: false + description: Title of to-do list. + type: string +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 +{% endconfiguration %} + +### Examples + +Title example: + +```yaml +type: todo-list +entity: todo-list +title: todo list +``` diff --git a/source/_dashboards/vertical-stack.markdown b/source/_dashboards/vertical-stack.markdown index 0e13b9ce21e..56212aec535 100644 --- a/source/_dashboards/vertical-stack.markdown +++ b/source/_dashboards/vertical-stack.markdown @@ -3,6 +3,9 @@ type: card title: "Vertical stack card" sidebar_label: Vertical stack description: "The vertical stack card allows you to group multiple cards so they always sit in the same column." +related: + - docs: /dashboards/cards/ + title: Dashboard cards --- The vertical stack card allows you to group multiple cards so they always sit in the same column. @@ -71,3 +74,4 @@ cards: Create a grid layout using vertical and horizontal stack Create a grid layout using vertical and horizontal stack.

+ diff --git a/source/_dashboards/weather-forecast.markdown b/source/_dashboards/weather-forecast.markdown index 5e6f3a4e198..2ef07499650 100644 --- a/source/_dashboards/weather-forecast.markdown +++ b/source/_dashboards/weather-forecast.markdown @@ -3,6 +3,11 @@ type: card title: "Weather forecast card" sidebar_label: Weather forecast description: "The weather forecast card displays the weather. Very useful to include on interfaces that people display on the wall." +related: + - docs: /integrations/frontend/ + title: Themes + - docs: /dashboards/cards/ + title: Dashboard cards --- The weather forecast card displays the weather. This card is particularly useful on wall-mounted displays. diff --git a/source/_data/countries.yaml b/source/_data/countries.yaml new file mode 100644 index 00000000000..a916e452bac --- /dev/null +++ b/source/_data/countries.yaml @@ -0,0 +1,4609 @@ +# List of countries and "states" used for the CLA sign page +# https://www.home-assistant.io/developers/cla_sign/ +# source/developers/cla_sign.html +Afghanistan: + - Badakhshan + - Badghis + - Baghlan + - Balkh + - Bamian + - Farah + - Faryab + - Ghazni + - Ghowr + - Helmand + - Herat + - Jowzjan + - Kabol + - Kandahar + - Kapisa + - Konar + - Kondoz + - Laghman + - Lowgar + - Nangarhar + - Nimruz + - Oruzgan + - Paktia + - Paktika + - Parvan + - Samangan + - Sar-e Pol + - Takhar + - Vardak + - Zabol +Albania: + - Berat + - Bulqize + - Delvine + - Devoll (Bilisht) + - Diber (Peshkopi) + - Durres + - Elbasan + - Fier + - Gjirokaster + - Gramsh + - Has (Krume) + - Kavaje + - Kolonje (Erseke) + - Korce + - Kruje + - Kucove + - Kukes + - Kurbin + - Lezhe + - Librazhd + - Lushnje + - Malesi e Madhe (Koplik) + - Mallakaster (Ballsh) + - Mat (Burrel) + - Mirdite (Rreshen) + - Peqin + - Permet + - Pogradec + - Puke + - Sarande + - Shkoder + - Skrapar (Corovode) + - Tepelene + - Tirane (Tirana) + - Tirane (Tirana) + - Tropoje (Bajram Curri) + - Vlore +Algeria: + - Adrar + - Ain Defla + - Ain Temouchent + - Alger + - Annaba + - Batna + - Bechar + - Bejaia + - Biskra + - Blida + - Bordj Bou Arreridj + - Bouira + - Boumerdes + - Chlef + - Constantine + - Djelfa + - El Bayadh + - El Oued + - El Tarf + - Ghardaia + - Guelma + - Illizi + - Jijel + - Khenchela + - Laghouat + - M'Sila + - Mascara + - Medea + - Mila + - Mostaganem + - Naama + - Oran + - Ouargla + - Oum el Bouaghi + - Relizane + - Saida + - Setif + - Sidi Bel Abbes + - Skikda + - Souk Ahras + - Tamanghasset + - Tebessa + - Tiaret + - Tindouf + - Tipaza + - Tissemsilt + - Tizi Ouzou + - Tlemcen +American Samoa: + - Eastern + - Manu'a + - Rose Island + - Swains Island + - Western +Angola: + - Andorra la Vella + - Bengo + - Benguela + - Bie + - Cabinda + - Canillo + - Cuando Cubango + - Cuanza Norte + - Cuanza Sul + - Cunene + - Encamp + - Escaldes-Engordany + - Huambo + - Huila + - La Massana + - Luanda + - Lunda Norte + - Lunda Sul + - Malanje + - Moxico + - Namibe + - Ordino + - Sant Julia de Loria + - Uige + - Zaire +Anguilla: + - Anguilla +Antartica: + - Antartica +Antigua and Barbuda: + - Barbuda + - Redonda + - Saint George + - Saint John + - Saint Mary + - Saint Paul + - Saint Peter + - Saint Philip +Argentina: + - Antartica e Islas del Atlantico Sur + - Buenos Aires + - Buenos Aires Capital Federal + - Catamarca + - Chaco + - Chubut + - Cordoba + - Corrientes + - Entre Rios + - Formosa + - Jujuy + - La Pampa + - La Rioja + - Mendoza + - Misiones + - Neuquen + - Rio Negro + - Salta + - San Juan + - San Luis + - Santa Cruz + - Santa Fe + - Santiago del Estero + - Tierra del Fuego + - Tucuman +Armenia: + - Aragatsotn + - Ararat + - Armavir + - Geghark'unik' + - Kotayk' + - Lorri + - Shirak + - Syunik' + - Tavush + - Vayots' Dzor + - Yerevan +Aruba: + - Aruba +Ashmore and Cartier Island: + - Ashmore and Cartier Island +Australia: + - Australian Capital Territory + - New South Wales + - Northern Territory + - Queensland + - South Australia + - Tasmania + - Victoria + - Western Australia +Austria: + - Burgenland + - Kaernten + - Niederoesterreich + - Oberoesterreich + - Salzburg + - Steiermark + - Tirol + - Vorarlberg + - Wien +Azerbaijan: + - Abseron Rayonu + - Agcabadi Rayonu + - Agdam Rayonu + - Agdas Rayonu + - Agstafa Rayonu + - Agsu Rayonu + - Ali Bayramli Sahari + - Astara Rayonu + - Baki Sahari + - Balakan Rayonu + - Barda Rayonu + - Beylaqan Rayonu + - Bilasuvar Rayonu + - Cabrayil Rayonu + - Calilabad Rayonu + - Daskasan Rayonu + - Davaci Rayonu + - Fuzuli Rayonu + - Gadabay Rayonu + - Ganca Sahari + - Goranboy Rayonu + - Goycay Rayonu + - Haciqabul Rayonu + - Imisli Rayonu + - Ismayilli Rayonu + - Kalbacar Rayonu + - Kurdamir Rayonu + - Lacin Rayonu + - Lankaran Rayonu + - Lankaran Sahari + - Lerik Rayonu + - Masalli Rayonu + - Mingacevir Sahari + - Naftalan Sahari + - Naxcivan Muxtar Respublikasi + - Neftcala Rayonu + - Oguz Rayonu + - Qabala Rayonu + - Qax Rayonu + - Qazax Rayonu + - Qobustan Rayonu + - Quba Rayonu + - Qubadli Rayonu + - Qusar Rayonu + - Saatli Rayonu + - Sabirabad Rayonu + - Saki Rayonu + - Saki Sahari + - Salyan Rayonu + - Samaxi Rayonu + - Samkir Rayonu + - Samux Rayonu + - Siyazan Rayonu + - Sumqayit Sahari + - Susa Rayonu + - Susa Sahari + - Tartar Rayonu + - Tovuz Rayonu + - Ucar Rayonu + - Xacmaz Rayonu + - Xankandi Sahari + - Xanlar Rayonu + - Xizi Rayonu + - Xocali Rayonu + - Xocavand Rayonu + - Yardimli Rayonu + - Yevlax Rayonu + - Yevlax Sahari + - Zangilan Rayonu + - Zaqatala Rayonu + - Zardab Rayonu +Bahamas: + - Acklins and Crooked Islands + - Bimini + - Cat Island + - Exuma + - Freeport + - Fresh Creek + - Governor's Harbour + - Green Turtle Cay + - Harbour Island + - High Rock + - Inagua + - Kemps Bay + - Long Island + - Marsh Harbour + - Mayaguana + - New Providence + - Nicholls Town and Berry Islands + - Ragged Island + - Rock Sound + - San Salvador and Rum Cay + - Sandy Point +Bahrain: + - Al Hadd + - Al Manamah + - Al Mintaqah al Gharbiyah + - Al Mintaqah al Wusta + - Al Mintaqah ash Shamaliyah + - Al Muharraq + - Ar Rifa' wa al Mintaqah al Janubiyah + - Jidd Hafs + - Juzur Hawar + - Madinat 'Isa + - Madinat Hamad + - Sitrah +Bangladesh: + - Barguna + - Barisal + - Bhola + - Jhalokati + - Patuakhali + - Pirojpur + - Bandarban + - Brahmanbaria + - Chandpur + - Chittagong + - Comilla + - Cox's Bazar + - Feni + - Khagrachari + - Lakshmipur + - Noakhali + - Rangamati + - Dhaka + - Faridpur + - Gazipur + - Gopalganj + - Jamalpur + - Kishoreganj + - Madaripur + - Manikganj + - Munshiganj + - Mymensingh + - Narayanganj + - Narsingdi + - Netrokona + - Rajbari + - Shariatpur + - Sherpur + - Tangail + - Bagerhat + - Chuadanga + - Jessore + - Jhenaidah + - Khulna + - Kushtia + - Magura + - Meherpur + - Narail + - Satkhira + - Bogra + - Dinajpur + - Gaibandha + - Jaipurhat + - Kurigram + - Lalmonirhat + - Naogaon + - Natore + - Nawabganj + - Nilphamari + - Pabna + - Panchagarh + - Rajshahi + - Rangpur + - Sirajganj + - Thakurgaon + - Habiganj + - Maulvi bazar + - Sunamganj + - Sylhet +Barbados: + - Bridgetown + - Christ Church + - Saint Andrew + - Saint George + - Saint James + - Saint John + - Saint Joseph + - Saint Lucy + - Saint Michael + - Saint Peter + - Saint Philip + - Saint Thomas +Belarus: + - Brestskaya (Brest) + - Homyel'skaya (Homyel') + - Horad Minsk + - Hrodzyenskaya (Hrodna) + - Mahilyowskaya (Mahilyow) + - Minskaya + - Vitsyebskaya (Vitsyebsk) +Belgium: + - Antwerpen + - Brabant Wallon + - Brussels Capitol Region + - Hainaut + - Liege + - Limburg + - Luxembourg + - Namur + - Oost-Vlaanderen + - Vlaams Brabant + - West-Vlaanderen +Belize: + - Belize + - Cayo + - Corozal + - Orange Walk + - Stann Creek + - Toledo +Benin: + - Alibori + - Atakora + - Atlantique + - Borgou + - Collines + - Couffo + - Donga + - Littoral + - Mono + - Oueme + - Plateau + - Zou +Bermuda: + - Devonshire + - Hamilton + - Hamilton + - Paget + - Pembroke + - Saint George + - Saint Georges + - Sandys + - Smiths + - Southampton + - Warwick +Bhutan: + - Bumthang + - Chhukha + - Chirang + - Daga + - Geylegphug + - Ha + - Lhuntshi + - Mongar + - Paro + - Pemagatsel + - Punakha + - Samchi + - Samdrup Jongkhar + - Shemgang + - Tashigang + - Thimphu + - Tongsa + - Wangdi Phodrang +Bolivia: + - Beni + - Chuquisaca + - Cochabamba + - La Paz + - Oruro + - Pando + - Potosi + - Santa Cruz + - Tarija +Bosnia and Herzegovina: + - Federation of Bosnia and Herzegovina + - Republika Srpska +Botswana: + - Central + - Chobe + - Francistown + - Gaborone + - Ghanzi + - Kgalagadi + - Kgatleng + - Kweneng + - Lobatse + - Ngamiland + - North-East + - Selebi-Pikwe + - South-East + - Southern +Brazil: + - Acre + - Alagoas + - Amapa + - Amazonas + - Bahia + - Ceara + - Distrito Federal + - Espirito Santo + - Goias + - Maranhao + - Mato Grosso + - Mato Grosso do Sul + - Minas Gerais + - Para + - Paraiba + - Parana + - Pernambuco + - Piaui + - Rio de Janeiro + - Rio Grande do Norte + - Rio Grande do Sul + - Rondonia + - Roraima + - Santa Catarina + - Sao Paulo + - Sergipe + - Tocantins +British Virgin Islands: + - Anegada + - Jost Van Dyke + - Tortola + - Virgin Gorda +Brunei: + - Belait + - Brunei and Muara + - Temburong + - Tutong +Bulgaria: + - Blagoevgrad + - Burgas + - Dobrich + - Gabrovo + - Khaskovo + - Kurdzhali + - Kyustendil + - Lovech + - Montana + - Pazardzhik + - Pernik + - Pleven + - Plovdiv + - Razgrad + - Ruse + - Shumen + - Silistra + - Sliven + - Smolyan + - Sofiya + - Sofiya-Grad + - Stara Zagora + - Turgovishte + - Varna + - Veliko Turnovo + - Vidin + - Vratsa + - Yambol +Burkina Faso: + - Bale + - Bam + - Banwa + - Bazega + - Bougouriba + - Boulgou + - Boulkiemde + - Comoe + - Ganzourgou + - Gnagna + - Gourma + - Houet + - Ioba + - Kadiogo + - Kenedougou + - Komandjari + - Kompienga + - Kossi + - Koupelogo + - Kouritenga + - Kourweogo + - Leraba + - Loroum + - Mouhoun + - Nahouri + - Namentenga + - Naumbiel + - Nayala + - Oubritenga + - Oudalan + - Passore + - Poni + - Samentenga + - Sanguie + - Seno + - Sissili + - Soum + - Sourou + - Tapoa + - Tuy + - Yagha + - Yatenga + - Ziro + - Zondomo + - Zoundweogo +Burma: + - Ayeyarwady + - Bago + - Chin State + - Kachin State + - Kayah State + - Kayin State + - Magway + - Mandalay + - Mon State + - Rakhine State + - Sagaing + - Shan State + - Tanintharyi + - Yangon +Burundi: + - Bubanza + - Bujumbura + - Bururi + - Cankuzo + - Cibitoke + - Gitega + - Karuzi + - Kayanza + - Kirundo + - Makamba + - Muramvya + - Muyinga + - Mwaro + - Ngozi + - Rutana + - Ruyigi +Cambodia: + - Banteay Mean Cheay + - Batdambang + - Kampong Cham + - Kampong Chhnang + - Kampong Spoe + - Kampong Thum + - Kampot + - Kandal + - Kaoh Kong + - Keb + - Kracheh + - Mondol Kiri + - Otdar Mean Cheay + - Pailin + - Phnum Penh + - Pouthisat + - Preah Seihanu (Sihanoukville) + - Preah Vihear + - Prey Veng + - Rotanah Kiri + - Siem Reab + - Stoeng Treng + - Svay Rieng + - Takev +Cameroon: + - Adamaoua + - Centre + - Est + - Extreme-Nord + - Littoral + - Nord + - Nord-Ouest + - Ouest + - Sud + - Sud-Ouest +Canada: + - Alberta + - British Columbia + - Manitoba + - New Brunswick + - Newfoundland + - Northwest Territories + - Nova Scotia + - Nunavut + - Ontario + - Prince Edward Island + - Quebec + - Saskatchewan + - Yukon Territory +Cape Verde: + - Boa Vista + - Brava + - Maio + - Mosteiros + - Paul + - Porto Novo + - Praia + - Ribeira Grande + - Sal + - Santa Catarina + - Santa Cruz + - Sao Domingos + - Sao Filipe + - Sao Nicolau + - Sao Vicente + - Tarrafal +Cayman Islands: + - Creek + - Eastern + - Midland + - South Town + - Spot Bay + - Stake Bay + - West End + - Western +Central African Republic: + - Bamingui-Bangoran + - Bangui + - Basse-Kotto + - Gribingui + - Haut-Mbomou + - Haute-Kotto + - Haute-Sangha + - Kemo-Gribingui + - Lobaye + - Mbomou + - Nana-Mambere + - Ombella-Mpoko + - Ouaka + - Ouham + - Ouham-Pende + - Sangha + - Vakaga +Chad: + - Batha + - Biltine + - Borkou-Ennedi-Tibesti + - Chari-Baguirmi + - Guera + - Kanem + - Lac + - Logone Occidental + - Logone Oriental + - Mayo-Kebbi + - Moyen-Chari + - Ouaddai + - Salamat + - Tandjile +Chile: + - Aisen del General Carlos Ibanez del Campo + - Antofagasta + - Araucania + - Atacama + - Bio-Bio + - Coquimbo + - Libertador General Bernardo O'Higgins + - Los Lagos + - Magallanes y de la Antartica Chilena + - Maule + - Region Metropolitana (Santiago) + - Tarapaca + - Valparaiso +China: + - Anhui + - Beijing + - Chongqing + - Fujian + - Gansu + - Guangdong + - Guangxi + - Guizhou + - Hainan + - Hebei + - Heilongjiang + - Henan + - Hubei + - Hunan + - Jiangsu + - Jiangxi + - Jilin + - Liaoning + - Nei Mongol + - Ningxia + - Qinghai + - Shaanxi + - Shandong + - Shanghai + - Shanxi + - Sichuan + - Tianjin + - Xinjiang + - Xizang (Tibet) + - Yunnan + - Zhejiang +Christmas Island: + - Christmas Island +Clipperton Island: + - Clipperton Island +Cocos (Keeling) Islands: + - Direction Island + - Home Island + - Horsburgh Island + - North Keeling Island + - South Island + - West Island +Colombia: + - Amazonas + - Antioquia + - Arauca + - Atlantico + - Bolivar + - Boyaca + - Caldas + - Caqueta + - Casanare + - Cauca + - Cesar + - Choco + - Cordoba + - Cundinamarca + - Distrito Capital de Santa Fe de Bogota + - Guainia + - Guaviare + - Huila + - La Guajira + - Magdalena + - Meta + - Narino + - Norte de Santander + - Putumayo + - Quindio + - Risaralda + - San Andres y Providencia + - Santander + - Sucre + - Tolima + - Valle del Cauca + - Vaupes + - Vichada +Comoros: + - Anjouan (Nzwani) + - Domoni + - Fomboni + - Grande Comore (Njazidja) + - Moheli (Mwali) + - Moroni + - Moutsamoudou +Congo, Democratic Republic of the: + - Bandundu + - Bas-Congo + - Equateur + - Kasai-Occidental + - Kasai-Oriental + - Katanga + - Kinshasa + - Maniema + - Nord-Kivu + - Orientale + - Sud-Kivu +Congo, Republic of the: + - Bouenza + - Brazzaville + - Cuvette + - Kouilou + - Lekoumou + - Likouala + - Niari + - Plateaux + - Pool + - Sangha +Cook Islands: + - Aitutaki + - Atiu + - Avarua + - Mangaia + - Manihiki + - Manuae + - Mauke + - Mitiaro + - Nassau Island + - Palmerston + - Penrhyn + - Pukapuka + - Rakahanga + - Rarotonga + - Suwarrow + - Takutea +Costa Rica: + - Alajuela + - Cartago + - Guanacaste + - Heredia + - Limon + - Puntarenas + - San Jose +Cote d'Ivoire: + - Abengourou + - Abidjan + - Aboisso + - Adiake' + - Adzope + - Agboville + - Agnibilekrou + - Ale'pe' + - Bangolo + - Beoumi + - Biankouma + - Bocanda + - Bondoukou + - Bongouanou + - Bouafle + - Bouake + - Bouna + - Boundiali + - Dabakala + - Dabon + - Daloa + - Danane + - Daoukro + - Dimbokro + - Divo + - Duekoue + - Ferkessedougou + - Gagnoa + - Grand Bassam + - Grand-Lahou + - Guiglo + - Issia + - Jacqueville + - Katiola + - Korhogo + - Lakota + - Man + - Mankono + - Mbahiakro + - Odienne + - Oume + - Sakassou + - San-Pedro + - Sassandra + - Seguela + - Sinfra + - Soubre + - Tabou + - Tanda + - Tiassale + - Tiebissou + - Tingrela + - Touba + - Toulepleu + - Toumodi + - Vavoua + - Yamoussoukro + - Zuenoula +Croatia: + - Bjelovarsko-Bilogorska Zupanija + - Brodsko-Posavska Zupanija + - Dubrovacko-Neretvanska Zupanija + - Istarska Zupanija + - Karlovacka Zupanija + - Koprivnicko-Krizevacka Zupanija + - Krapinsko-Zagorska Zupanija + - Licko-Senjska Zupanija + - Medimurska Zupanija + - Osjecko-Baranjska Zupanija + - Pozesko-Slavonska Zupanija + - Primorsko-Goranska Zupanija + - Sibensko-Kninska Zupanija + - Sisacko-Moslavacka Zupanija + - Splitsko-Dalmatinska Zupanija + - Varazdinska Zupanija + - Viroviticko-Podravska Zupanija + - Vukovarsko-Srijemska Zupanija + - Zadarska Zupanija + - Zagreb + - Zagrebacka Zupanija +Cuba: + - Camaguey + - Ciego de Avila + - Cienfuegos + - Ciudad de La Habana + - Granma + - Guantanamo + - Holguin + - Isla de la Juventud + - La Habana + - Las Tunas + - Matanzas + - Pinar del Rio + - Sancti Spiritus + - Santiago de Cuba + - Villa Clara +Cyprus: + - Famagusta + - Kyrenia + - Larnaca + - Limassol + - Nicosia + - Paphos +Czechia: + - Brnensky + - Budejovicky + - Jihlavsky + - Karlovarsky + - Kralovehradecky + - Liberecky + - Olomoucky + - Ostravsky + - Pardubicky + - Plzensky + - Praha + - Stredocesky + - Ustecky + - Zlinsky +Denmark: + - Nordjylland + - Midtjylland + - Syddanmark + - Hovedstaden + - Sjaelland +Djibouti: + - "'Ali Sabih" + - Dikhil + - Djibouti + - Obock + - Tadjoura +Dominica: + - Saint Andrew + - Saint David + - Saint George + - Saint John + - Saint Joseph + - Saint Luke + - Saint Mark + - Saint Patrick + - Saint Paul + - Saint Peter +Dominican Republic: + - Azua + - Baoruco + - Barahona + - Dajabon + - Distrito Nacional + - Duarte + - El Seibo + - Elias Pina + - Espaillat + - Hato Mayor + - Independencia + - La Altagracia + - La Romana + - La Vega + - Maria Trinidad Sanchez + - Monsenor Nouel + - Monte Cristi + - Monte Plata + - Pedernales + - Peravia + - Puerto Plata + - Salcedo + - Samana + - San Cristobal + - San Juan + - San Pedro de Macoris + - Sanchez Ramirez + - Santiago + - Santiago Rodriguez + - Valverde +Ecuador: + - Azuay + - Bolivar + - Canar + - Carchi + - Chimborazo + - Cotopaxi + - El Oro + - Esmeraldas + - Galapagos + - Guayas + - Imbabura + - Loja + - Los Rios + - Manabi + - Morona-Santiago + - Napo + - Orellana + - Pastaza + - Pichincha + - Sucumbios + - Tungurahua + - Zamora-Chinchipe +Egypt: + - Ad Daqahliyah + - Al Bahr al Ahmar + - Al Buhayrah + - Al Fayyum + - Al Gharbiyah + - Al Iskandariyah + - Al Isma'iliyah + - Al Jizah + - Al Minufiyah + - Al Minya + - Al Qahirah + - Al Qalyubiyah + - Al Wadi al Jadid + - As Suways + - Ash Sharqiyah + - Aswan + - Asyut + - Bani Suwayf + - Bur Sa'id + - Dumyat + - Janub Sina' + - Kafr ash Shaykh + - Matruh + - Qina + - Shamal Sina' + - Suhaj +El Salvador: + - Ahuachapan + - Cabanas + - Chalatenango + - Cuscatlan + - La Libertad + - La Paz + - La Union + - Morazan + - San Miguel + - San Salvador + - San Vicente + - Santa Ana + - Sonsonate + - Usulutan +Equatorial Guinea: + - Annobon + - Bioko Norte + - Bioko Sur + - Centro Sur + - Kie-Ntem + - Litoral + - Wele-Nzas +Eritrea: + - Akale Guzay + - Barka + - Denkel + - Hamasen + - Sahil + - Semhar + - Senhit + - Seraye +Estonia: + - Harjumaa (Tallinn) + - Hiiumaa (Kardla) + - Ida-Virumaa (Johvi) + - Jarvamaa (Paide) + - Jogevamaa (Jogeva) + - Laane-Virumaa (Rakvere) + - Laanemaa (Haapsalu) + - Parnumaa (Parnu) + - Polvamaa (Polva) + - Raplamaa (Rapla) + - Saaremaa (Kuessaare) + - Tartumaa (Tartu) + - Valgamaa (Valga) + - Viljandimaa (Viljandi) + - Vorumaa (Voru) +Ethiopia: + - Adis Abeba (Addis Ababa) + - Afar + - Amara + - Dire Dawa + - Gambela Hizboch + - Hareri Hizb + - Oromiya + - Sumale + - Tigray + - YeDebub Biheroch Bihereseboch na Hizboch +Europa Island: + - Europa Island +Falkland Islands (Islas Malvinas): + - Falkland Islands (Islas Malvinas) +Faroe Islands: + - Bordoy + - Eysturoy + - Mykines + - Sandoy + - Skuvoy + - Streymoy + - Suduroy + - Tvoroyri + - Vagar +Fiji: + - Central + - Eastern + - Northern + - Rotuma + - Western +Finland: + - Aland + - Etela-Suomen Laani + - Ita-Suomen Laani + - Lansi-Suomen Laani + - Lappi + - Oulun Laani +France: + - Alsace + - Aquitaine + - Auvergne + - Basse-Normandie + - Bourgogne + - Bretagne + - Centre + - Champagne-Ardenne + - Corse + - Franche-Comte + - Haute-Normandie + - Ile-de-France + - Languedoc-Roussillon + - Limousin + - Lorraine + - Midi-Pyrenees + - Nord-Pas-de-Calais + - Pays de la Loire + - Picardie + - Poitou-Charentes + - Provence-Alpes-Cote d'Azur + - Rhone-Alpes +French Guiana: + - French Guiana +French Polynesia: + - Archipel des Marquises + - Archipel des Tuamotu + - Archipel des Tubuai + - Iles du Vent + - Iles Sous-le-Vent +French Southern and Antarctic Lands: + - Adelie Land + - Ile Crozet + - Iles Kerguelen + - Iles Saint-Paul et Amsterdam +Gabon: + - Estuaire + - Haut-Ogooue + - Moyen-Ogooue + - Ngounie + - Nyanga + - Ogooue-Ivindo + - Ogooue-Lolo + - Ogooue-Maritime + - Woleu-Ntem +Gambia, The: + - Banjul + - Central River + - Lower River + - North Bank + - Upper River + - Western +Gaza Strip: + - Gaza Strip +Georgia: + - Abashis + - Abkhazia or Ap'khazet'is Avtonomiuri Respublika (Sokhumi) + - Adigenis + - Ajaria or Acharis Avtonomiuri Respublika (Bat'umi) + - Akhalgoris + - Akhalk'alak'is + - Akhalts'ikhis + - Akhmetis + - Ambrolauris + - Aspindzis + - Baghdat'is + - Bolnisis + - Borjomis + - Ch'khorotsqus + - Ch'okhatauris + - Chiat'ura + - Dedop'listsqaros + - Dmanisis + - Dushet'is + - Gardabanis + - Gori + - Goris + - Gurjaanis + - Javis + - K'arelis + - K'ut'aisi + - Kaspis + - Kharagaulis + - Khashuris + - Khobis + - Khonis + - Lagodekhis + - Lanch'khut'is + - Lentekhis + - Marneulis + - Martvilis + - Mestiis + - Mts'khet'is + - Ninotsmindis + - Onis + - Ozurget'is + - P'ot'i + - Qazbegis + - Qvarlis + - Rust'avi + - Sach'kheris + - Sagarejos + - Samtrediis + - Senakis + - Sighnaghis + - T'bilisi + - T'elavis + - T'erjolis + - T'et'ritsqaros + - T'ianet'is + - Tqibuli + - Ts'ageris + - Tsalenjikhis + - Tsalkis + - Tsqaltubo + - Vanis + - Zestap'onis + - Zugdidi + - Zugdidis +Germany: + - Baden-Wuerttemberg + - Bayern + - Berlin + - Brandenburg + - Bremen + - Hamburg + - Hessen + - Mecklenburg-Vorpommern + - Niedersachsen + - Nordrhein-Westfalen + - Rheinland-Pfalz + - Saarland + - Sachsen + - Sachsen-Anhalt + - Schleswig-Holstein + - Thueringen +Ghana: + - Ashanti + - Brong-Ahafo + - Central + - Eastern + - Greater Accra + - Northern + - Upper East + - Upper West + - Volta + - Western +Gibraltar: + - Gibraltar +Glorioso Islands: + - Ile du Lys + - Ile Glorieuse +Greece: + - Aitolia kai Akarnania + - Akhaia + - Argolis + - Arkadhia + - Arta + - Attiki + - Ayion Oros (Mt. Athos) + - Dhodhekanisos + - Drama + - Evritania + - Evros + - Evvoia + - Florina + - Fokis + - Fthiotis + - Grevena + - Ilia + - Imathia + - Ioannina + - Irakleion + - Kardhitsa + - Kastoria + - Kavala + - Kefallinia + - Kerkyra + - Khalkidhiki + - Khania + - Khios + - Kikladhes + - Kilkis + - Korinthia + - Kozani + - Lakonia + - Larisa + - Lasithi + - Lesvos + - Levkas + - Magnisia + - Messinia + - Pella + - Pieria + - Preveza + - Rethimni + - Rodhopi + - Samos + - Serrai + - Thesprotia + - Thessaloniki + - Trikala + - Voiotia + - Xanthi + - Zakinthos +Greenland: + - Avannaa (Nordgronland) + - Kitaa (Vestgronland) + - Tunu (Ostgronland) +Grenada: + - Carriacou and Petit Martinique + - Saint Andrew + - Saint David + - Saint George + - Saint John + - Saint Mark + - Saint Patrick +Guadeloupe: + - Basse-Terre + - Grande-Terre + - Iles de la Petite Terre + - Iles des Saintes + - Marie-Galante +Guam: + - Guam +Guatemala: + - Alta Verapaz + - Baja Verapaz + - Chimaltenango + - Chiquimula + - El Progreso + - Escuintla + - Guatemala + - Huehuetenango + - Izabal + - Jalapa + - Jutiapa + - Peten + - Quetzaltenango + - Quiche + - Retalhuleu + - Sacatepequez + - San Marcos + - Santa Rosa + - Solola + - Suchitepequez + - Totonicapan + - Zacapa +Guernsey: + - Castel + - Forest + - St. Andrew + - St. Martin + - St. Peter Port + - St. Pierre du Bois + - St. Sampson + - St. Saviour + - Torteval + - Vale +Guinea: + - Beyla + - Boffa + - Boke + - Conakry + - Coyah + - Dabola + - Dalaba + - Dinguiraye + - Dubreka + - Faranah + - Forecariah + - Fria + - Gaoual + - Gueckedou + - Kankan + - Kerouane + - Kindia + - Kissidougou + - Koubia + - Koundara + - Kouroussa + - Labe + - Lelouma + - Lola + - Macenta + - Mali + - Mamou + - Mandiana + - Nzerekore + - Pita + - Siguiri + - Telimele + - Tougue + - Yomou +Guinea-Bissau: + - Bafata + - Biombo + - Bissau + - Bolama-Bijagos + - Cacheu + - Gabu + - Oio + - Quinara + - Tombali +Guyana: + - Barima-Waini + - Cuyuni-Mazaruni + - Demerara-Mahaica + - East Berbice-Corentyne + - Essequibo Islands-West Demerara + - Mahaica-Berbice + - Pomeroon-Supenaam + - Potaro-Siparuni + - Upper Demerara-Berbice + - Upper Takutu-Upper Essequibo +Haiti: + - Artibonite + - Centre + - Grand'Anse + - Nord + - Nord-Est + - Nord-Ouest + - Ouest + - Sud + - Sud-Est +Heard Island and McDonald Islands: + - Heard Island and McDonald Islands +Holy See (Vatican City): + - Holy See (Vatican City) +Honduras: + - Atlantida + - Choluteca + - Colon + - Comayagua + - Copan + - Cortes + - El Paraiso + - Francisco Morazan + - Gracias a Dios + - Intibuca + - Islas de la Bahia + - La Paz + - Lempira + - Ocotepeque + - Olancho + - Santa Barbara + - Valle + - Yoro +Hong Kong: + - Hong Kong +Howland Island: + - Howland Island +Hungary: + - Bacs-Kiskun + - Baranya + - Bekes + - Bekescsaba + - Borsod-Abauj-Zemplen + - Budapest + - Csongrad + - Debrecen + - Dunaujvaros + - Eger + - Fejer + - Gyor + - Gyor-Moson-Sopron + - Hajdu-Bihar + - Heves + - Hodmezovasarhely + - Jasz-Nagykun-Szolnok + - Kaposvar + - Kecskemet + - Komarom-Esztergom + - Miskolc + - Nagykanizsa + - Nograd + - Nyiregyhaza + - Pecs + - Pest + - Somogy + - Sopron + - Szabolcs-Szatmar-Bereg + - Szeged + - Szekesfehervar + - Szolnok + - Szombathely + - Tatabanya + - Tolna + - Vas + - Veszprem + - Veszprem + - Zala + - Zalaegerszeg +Iceland: + - Akranes + - Akureyri + - Arnessysla + - Austur-Bardhastrandarsysla + - Austur-Hunavatnssysla + - Austur-Skaftafellssysla + - Borgarfjardharsysla + - Dalasysla + - Eyjafjardharsysla + - Gullbringusysla + - Hafnarfjordhur + - Husavik + - Isafjordhur + - Keflavik + - Kjosarsysla + - Kopavogur + - Myrasysla + - Neskaupstadhur + - Nordhur-Isafjardharsysla + - Nordhur-Mulasys-la + - Nordhur-Thingeyjarsysla + - Olafsfjordhur + - Rangarvallasysla + - Reykjavik + - Saudharkrokur + - Seydhisfjordhur + - Siglufjordhur + - Skagafjardharsysla + - Snaefellsnes-og Hnappadalssysla + - Strandasysla + - Sudhur-Mulasysla + - Sudhur-Thingeyjarsysla + - Vesttmannaeyjar + - Vestur-Bardhastrandarsysla + - Vestur-Hunavatnssysla + - Vestur-Isafjardharsysla + - Vestur-Skaftafellssysla +India: + - Andaman and Nicobar Islands + - Andhra Pradesh + - Arunachal Pradesh + - Assam + - Bihar + - Chandigarh + - Chhattisgarh + - Dadra and Nagar Haveli + - Daman and Diu + - Delhi + - Goa + - Gujarat + - Haryana + - Himachal Pradesh + - Jammu and Kashmir + - Jharkhand + - Karnataka + - Kerala + - Lakshadweep + - Madhya Pradesh + - Maharashtra + - Manipur + - Meghalaya + - Mizoram + - Nagaland + - Orissa + - Pondicherry + - Punjab + - Rajasthan + - Sikkim + - Tamil Nadu + - Tripura + - Uttar Pradesh + - Uttaranchal + - West Bengal +Indonesia: + - Aceh + - Bali + - Banten + - Bengkulu + - East Timor + - Gorontalo + - Irian Jaya + - Jakarta Raya + - Jambi + - Jawa Barat + - Jawa Tengah + - Jawa Timur + - Kalimantan Barat + - Kalimantan Selatan + - Kalimantan Tengah + - Kalimantan Timur + - Kepulauan Bangka Belitung + - Lampung + - Maluku + - Maluku Utara + - Nusa Tenggara Barat + - Nusa Tenggara Timur + - Riau + - Sulawesi Selatan + - Sulawesi Tengah + - Sulawesi Tenggara + - Sulawesi Utara + - Sumatera Barat + - Sumatera Selatan + - Sumatera Utara + - Yogyakarta +Iran: + - Ardabil + - Azarbayjan-e Gharbi + - Azarbayjan-e Sharqi + - Bushehr + - Chahar Mahall va Bakhtiari + - Esfahan + - Fars + - Gilan + - Golestan + - Hamadan + - Hormozgan + - Ilam + - Kerman + - Kermanshah + - Khorasan + - Khuzestan + - Kohgiluyeh va Buyer Ahmad + - Kordestan + - Lorestan + - Markazi + - Mazandaran + - Qazvin + - Qom + - Semnan + - Sistan va Baluchestan + - Tehran + - Yazd + - Zanjan +Iraq: + - Al Anbar + - Al Basrah + - Al Muthanna + - Al Qadisiyah + - An Najaf + - Arbil + - As Sulaymaniyah + - At Ta'mim + - Babil + - Baghdad + - Dahuk + - Dhi Qar + - Diyala + - Karbala' + - Maysan + - Ninawa + - Salah ad Din + - Wasit +Ireland: + - Carlow + - Cavan + - Clare + - Cork + - Donegal + - Dublin + - Galway + - Kerry + - Kildare + - Kilkenny + - Laois + - Leitrim + - Limerick + - Longford + - Louth + - Mayo + - Meath + - Monaghan + - Offaly + - Roscommon + - Sligo + - Tipperary + - Waterford + - Westmeath + - Wexford + - Wicklow +Ireland, Northern: + - Antrim + - Ards + - Armagh + - Ballymena + - Ballymoney + - Banbridge + - Belfast + - Carrickfergus + - Castlereagh + - Coleraine + - Cookstown + - Craigavon + - Derry + - Down + - Dungannon + - Fermanagh + - Larne + - Limavady + - Lisburn + - Magherafelt + - Moyle + - Newry and Mourne + - Newtownabbey + - North Down + - Omagh + - Strabane +Israel: + - Central + - Haifa + - Jerusalem + - Northern + - Southern + - Tel Aviv +Italy: + - Abruzzo + - Basilicata + - Calabria + - Campania + - Emilia-Romagna + - Friuli-Venezia Giulia + - Lazio + - Liguria + - Lombardia + - Marche + - Molise + - Piemonte + - Puglia + - Sardegna + - Sicilia + - Toscana + - Trentino-Alto Adige + - Umbria + - Valle d'Aosta + - Veneto +Jamaica: + - Clarendon + - Hanover + - Kingston + - Manchester + - Portland + - Saint Andrew + - Saint Ann + - Saint Catherine + - Saint Elizabeth + - Saint James + - Saint Mary + - Saint Thomas + - Trelawny + - Westmoreland +Jan Mayen: + - Jan Mayen +Japan: + - Aichi + - Akita + - Aomori + - Chiba + - Ehime + - Fukui + - Fukuoka + - Fukushima + - Gifu + - Gumma + - Hiroshima + - Hokkaido + - Hyogo + - Ibaraki + - Ishikawa + - Iwate + - Kagawa + - Kagoshima + - Kanagawa + - Kochi + - Kumamoto + - Kyoto + - Mie + - Miyagi + - Miyazaki + - Nagano + - Nagasaki + - Nara + - Niigata + - Oita + - Okayama + - Okinawa + - Osaka + - Saga + - Saitama + - Shiga + - Shimane + - Shizuoka + - Tochigi + - Tokushima + - Tokyo + - Tottori + - Toyama + - Wakayama + - Yamagata + - Yamaguchi + - Yamanashi +Jarvis Island: + - Jarvis Island +Jersey: + - Jersey +Johnston Atoll: + - Johnston Atoll +Jordan: + - "'Amman" + - Ajlun + - Al 'Aqabah + - Al Balqa' + - Al Karak + - Al Mafraq + - At Tafilah + - Az Zarqa' + - Irbid + - Jarash + - Ma'an + - Madaba +Juan de Nova Island: + - Juan de Nova Island +Kazakhstan: + - Almaty + - Aqmola + - Aqtobe + - Astana + - Atyrau + - Batys Qazaqstan + - Bayqongyr + - Mangghystau + - Ongtustik Qazaqstan + - Pavlodar + - Qaraghandy + - Qostanay + - Qyzylorda + - Shyghys Qazaqstan + - Soltustik Qazaqstan + - Zhambyl +Kenya: + - Central + - Coast + - Eastern + - Nairobi Area + - North Eastern + - Nyanza + - Rift Valley + - Western +Kiribati: + - Abaiang + - Abemama + - Aranuka + - Arorae + - Banaba + - Banaba + - Beru + - Butaritari + - Central Gilberts + - Gilbert Islands + - Kanton + - Kiritimati + - Kuria + - Line Islands + - Line Islands + - Maiana + - Makin + - Marakei + - Nikunau + - Nonouti + - Northern Gilberts + - Onotoa + - Phoenix Islands + - Southern Gilberts + - Tabiteuea + - Tabuaeran + - Tamana + - Tarawa + - Tarawa + - Teraina +Korea, North: + - Chagang-do (Chagang Province) + - Hamgyong-bukto (North Hamgyong Province) + - Hamgyong-namdo (South Hamgyong Province) + - Hwanghae-bukto (North Hwanghae Province) + - Hwanghae-namdo (South Hwanghae Province) + - Kaesong-si (Kaesong City) + - Kangwon-do (Kangwon Province) + - Namp'o-si (Namp'o City) + - P'yongan-bukto (North P'yongan Province) + - P'yongan-namdo (South P'yongan Province) + - P'yongyang-si (P'yongyang City) + - Yanggang-do (Yanggang Province) +Korea, South: + - Ch'ungch'ong-bukto + - Ch'ungch'ong-namdo + - Cheju-do + - Cholla-bukto + - Cholla-namdo + - Inch'on-gwangyoksi + - Kangwon-do + - Kwangju-gwangyoksi + - Kyonggi-do + - Kyongsang-bukto + - Kyongsang-namdo + - Pusan-gwangyoksi + - Soul-t'ukpyolsi + - Taegu-gwangyoksi + - Taejon-gwangyoksi + - Ulsan-gwangyoksi +Kosovo: + - Kosovo +Kuwait: + - Al 'Asimah + - Al Ahmadi + - Al Farwaniyah + - Al Jahra' + - Hawalli +Kyrgyzstan: + - Batken Oblasty + - Bishkek Shaary + - Chuy Oblasty (Bishkek) + - Jalal-Abad Oblasty + - Naryn Oblasty + - Osh Oblasty + - Talas Oblasty + - Ysyk-Kol Oblasty (Karakol) +Laos: + - Attapu + - Bokeo + - Bolikhamxai + - Champasak + - Houaphan + - Khammouan + - Louangnamtha + - Louangphabang + - Oudomxai + - Phongsali + - Salavan + - Savannakhet + - Viangchan + - Viangchan + - Xaignabouli + - Xaisomboun + - Xekong + - Xiangkhoang +Latvia: + - Aizkraukles Rajons + - Aluksnes Rajons + - Balvu Rajons + - Bauskas Rajons + - Cesu Rajons + - Daugavpils + - Daugavpils Rajons + - Dobeles Rajons + - Gulbenes Rajons + - Jekabpils Rajons + - Jelgava + - Jelgavas Rajons + - Jurmala + - Kraslavas Rajons + - Kuldigas Rajons + - Leipaja + - Liepajas Rajons + - Limbazu Rajons + - Ludzas Rajons + - Madonas Rajons + - Ogres Rajons + - Preilu Rajons + - Rezekne + - Rezeknes Rajons + - Riga + - Rigas Rajons + - Saldus Rajons + - Talsu Rajons + - Tukuma Rajons + - Valkas Rajons + - Valmieras Rajons + - Ventspils + - Ventspils Rajons +Lebanon: + - Beyrouth + - Ech Chimal + - Ej Jnoub + - El Bekaa + - Jabal Loubnane +Lesotho: + - Berea + - Butha-Buthe + - Leribe + - Mafeteng + - Maseru + - Mohales Hoek + - Mokhotlong + - Qacha's Nek + - Quthing + - Thaba-Tseka +Liberia: + - Bomi + - Bong + - Grand Bassa + - Grand Cape Mount + - Grand Gedeh + - Grand Kru + - Lofa + - Margibi + - Maryland + - Montserrado + - Nimba + - River Cess + - Sinoe +Libya: + - Ajdabiya + - Al 'Aziziyah + - Al Fatih + - Al Jabal al Akhdar + - Al Jufrah + - Al Khums + - Al Kufrah + - An Nuqat al Khams + - Ash Shati' + - Awbari + - Az Zawiyah + - Banghazi + - Darnah + - Ghadamis + - Gharyan + - Misratah + - Murzuq + - Sabha + - Sawfajjin + - Surt + - Tarabulus + - Tarhunah + - Tubruq + - Yafran + - Zlitan +Liechtenstein: + - Balzers + - Eschen + - Gamprin + - Mauren + - Planken + - Ruggell + - Schaan + - Schellenberg + - Triesen + - Triesenberg + - Vaduz +Lithuania: + - Akmenes Rajonas + - Alytaus Rajonas + - Alytus + - Anyksciu Rajonas + - Birstonas + - Birzu Rajonas + - Druskininkai + - Ignalinos Rajonas + - Jonavos Rajonas + - Joniskio Rajonas + - Jurbarko Rajonas + - Kaisiadoriu Rajonas + - Kaunas + - Kauno Rajonas + - Kedainiu Rajonas + - Kelmes Rajonas + - Klaipeda + - Klaipedos Rajonas + - Kretingos Rajonas + - Kupiskio Rajonas + - Lazdiju Rajonas + - Marijampole + - Marijampoles Rajonas + - Mazeikiu Rajonas + - Moletu Rajonas + - Neringa Pakruojo Rajonas + - Palanga + - Panevezio Rajonas + - Panevezys + - Pasvalio Rajonas + - Plunges Rajonas + - Prienu Rajonas + - Radviliskio Rajonas + - Raseiniu Rajonas + - Rokiskio Rajonas + - Sakiu Rajonas + - Salcininku Rajonas + - Siauliai + - Siauliu Rajonas + - Silales Rajonas + - Silutes Rajonas + - Sirvintu Rajonas + - Skuodo Rajonas + - Svencioniu Rajonas + - Taurages Rajonas + - Telsiu Rajonas + - Traku Rajonas + - Ukmerges Rajonas + - Utenos Rajonas + - Varenos Rajonas + - Vilkaviskio Rajonas + - Vilniaus Rajonas + - Vilnius + - Zarasu Rajonas +Luxembourg: + - Diekirch + - Grevenmacher + - Luxembourg +Macau: + - Macau +Macedonia, Former Yugoslav Republic of: + - Aracinovo + - Bac + - Belcista + - Berovo + - Bistrica + - Bitola + - Blatec + - Bogdanci + - Bogomila + - Bogovinje + - Bosilovo + - Brvenica + - Cair (Skopje) + - Capari + - Caska + - Cegrane + - Centar (Skopje) + - Centar Zupa + - Cesinovo + - Cucer-Sandevo + - Debar + - Delcevo + - Delogozdi + - Demir Hisar + - Demir Kapija + - Dobrusevo + - Dolna Banjica + - Dolneni + - Dorce Petrov (Skopje) + - Drugovo + - Dzepciste + - Gazi Baba (Skopje) + - Gevgelija + - Gostivar + - Gradsko + - Ilinden + - Izvor + - Jegunovce + - Kamenjane + - Karbinci + - Karpos (Skopje) + - Kavadarci + - Kicevo + - Kisela Voda (Skopje) + - Klecevce + - Kocani + - Konce + - Kondovo + - Konopiste + - Kosel + - Kratovo + - Kriva Palanka + - Krivogastani + - Krusevo + - Kuklis + - Kukurecani + - Kumanovo + - Labunista + - Lipkovo + - Lozovo + - Lukovo + - Makedonska Kamenica + - Makedonski Brod + - Mavrovi Anovi + - Meseista + - Miravci + - Mogila + - Murtino + - Negotino + - Negotino-Poloska + - Novaci + - Novo Selo + - Oblesevo + - Ohrid + - Orasac + - Orizari + - Oslomej + - Pehcevo + - Petrovec + - Plasnia + - Podares + - Prilep + - Probistip + - Radovis + - Rankovce + - Resen + - Rosoman + - Rostusa + - Samokov + - Saraj + - Sipkovica + - Sopiste + - Sopotnika + - Srbinovo + - Star Dojran + - Staravina + - Staro Nagoricane + - Stip + - Struga + - Strumica + - Studenicani + - Suto Orizari (Skopje) + - Sveti Nikole + - Tearce + - Tetovo + - Topolcani + - Valandovo + - Vasilevo + - Veles + - Velesta + - Vevcani + - Vinica + - Vitoliste + - Vranestica + - Vrapciste + - Vratnica + - Vrutok + - Zajas + - Zelenikovo + - Zileno + - Zitose + - Zletovo + - Zrnovci +Madagascar: + - Antananarivo + - Antsiranana + - Fianarantsoa + - Mahajanga + - Toamasina + - Toliara +Malawi: + - Balaka + - Blantyre + - Chikwawa + - Chiradzulu + - Chitipa + - Dedza + - Dowa + - Karonga + - Kasungu + - Likoma + - Lilongwe + - Machinga (Kasupe) + - Mangochi + - Mchinji + - Mulanje + - Mwanza + - Mzimba + - Nkhata Bay + - Nkhotakota + - Nsanje + - Ntcheu + - Ntchisi + - Phalombe + - Rumphi + - Salima + - Thyolo + - Zomba +Malaysia: + - Johor + - Kedah + - Kelantan + - Labuan + - Melaka + - Negeri Sembilan + - Pahang + - Perak + - Perlis + - Pulau Pinang + - Sabah + - Sarawak + - Selangor + - Terengganu + - Wilayah Persekutuan +Maldives: + - Alifu + - Baa + - Dhaalu + - Faafu + - Gaafu Alifu + - Gaafu Dhaalu + - Gnaviyani + - Haa Alifu + - Haa Dhaalu + - Kaafu + - Laamu + - Lhaviyani + - Maale + - Meemu + - Noonu + - Raa + - Seenu + - Shaviyani + - Thaa + - Vaavu +Mali: + - Gao + - Kayes + - Kidal + - Koulikoro + - Mopti + - Segou + - Sikasso + - Tombouctou +Malta: + - Valletta +Man, Isle of: + - Man, Isle of +Marshall Islands: + - Ailinginae + - Ailinglaplap + - Ailuk + - Arno + - Aur + - Bikar + - Bikini + - Bokak + - Ebon + - Enewetak + - Erikub + - Jabat + - Jaluit + - Jemo + - Kili + - Kwajalein + - Lae + - Lib + - Likiep + - Majuro + - Maloelap + - Mejit + - Mili + - Namorik + - Namu + - Rongelap + - Rongrik + - Toke + - Ujae + - Ujelang + - Utirik + - Wotho + - Wotje +Martinique: + - Martinique +Mauritania: + - Adrar + - Assaba + - Brakna + - Dakhlet Nouadhibou + - Gorgol + - Guidimaka + - Hodh Ech Chargui + - Hodh El Gharbi + - Inchiri + - Nouakchott + - Tagant + - Tiris Zemmour + - Trarza +Mauritius: + - Agalega Islands + - Black River + - Cargados Carajos Shoals + - Flacq + - Grand Port + - Moka + - Pamplemousses + - Plaines Wilhems + - Port Louis + - Riviere du Rempart + - Rodrigues + - Savanne +Mayotte: + - Mayotte +Mexico: + - Aguascalientes + - Baja California + - Baja California Sur + - Campeche + - Chiapas + - Chihuahua + - Coahuila de Zaragoza + - Colima + - Distrito Federal + - Durango + - Guanajuato + - Guerrero + - Hidalgo + - Jalisco + - Mexico + - Michoacan de Ocampo + - Morelos + - Nayarit + - Nuevo Leon + - Oaxaca + - Puebla + - Queretaro de Arteaga + - Quintana Roo + - San Luis Potosi + - Sinaloa + - Sonora + - Tabasco + - Tamaulipas + - Tlaxcala + - Veracruz-Llave + - Yucatan + - Zacatecas +Micronesia, Federated States of: + - Chuuk (Truk) + - Kosrae + - Pohnpei + - Yap +Midway Islands: + - Midway Islands +Moldova: + - Balti + - Cahul + - Chisinau + - Chisinau + - Dubasari + - Edinet + - Gagauzia + - Lapusna + - Orhei + - Soroca + - Tighina + - Ungheni +Monaco: + - Fontvieille + - La Condamine + - Monaco-Ville + - Monte-Carlo +Mongolia: + - Arhangay + - Bayan-Olgiy + - Bayanhongor + - Bulgan + - Darhan + - Dornod + - Dornogovi + - Dundgovi + - Dzavhan + - Erdenet + - Govi-Altay + - Hentiy + - Hovd + - Hovsgol + - Omnogovi + - Ovorhangay + - Selenge + - Suhbaatar + - Tov + - Ulaanbaatar + - Uvs +Montenegro: + - Montenegro +Montserrat: + - Saint Anthony + - Saint Georges + - Saint Peter's +Morocco: + - Agadir + - Al Hoceima + - Azilal + - Ben Slimane + - Beni Mellal + - Boulemane + - Casablanca + - Chaouen + - El Jadida + - El Kelaa des Srarhna + - Er Rachidia + - Essaouira + - Fes + - Figuig + - Guelmim + - Ifrane + - Kenitra + - Khemisset + - Khenifra + - Khouribga + - Laayoune + - Larache + - Marrakech + - Meknes + - Nador + - Ouarzazate + - Oujda + - Rabat-Sale + - Safi + - Settat + - Sidi Kacem + - Tan-Tan + - Tanger + - Taounate + - Taroudannt + - Tata + - Taza + - Tetouan + - Tiznit +Mozambique: + - Cabo Delgado + - Gaza + - Inhambane + - Manica + - Maputo + - Nampula + - Niassa + - Sofala + - Tete + - Zambezia +Namibia: + - Caprivi + - Erongo + - Hardap + - Karas + - Khomas + - Kunene + - Ohangwena + - Okavango + - Omaheke + - Omusati + - Oshana + - Oshikoto + - Otjozondjupa +Nauru: + - Aiwo + - Anabar + - Anetan + - Anibare + - Baiti + - Boe + - Buada + - Denigomodu + - Ewa + - Ijuw + - Meneng + - Nibok + - Uaboe + - Yaren +Nepal: + - Bagmati + - Bheri + - Dhawalagiri + - Gandaki + - Janakpur + - Karnali + - Kosi + - Lumbini + - Mahakali + - Mechi + - Narayani + - Rapti + - Sagarmatha + - Seti +Netherlands: + - Drenthe + - Flevoland + - Friesland + - Gelderland + - Groningen + - Limburg + - Noord-Brabant + - Noord-Holland + - Overijssel + - Utrecht + - Zeeland + - Zuid-Holland +Netherlands Antilles: + - Netherlands Antilles +New Caledonia: + - Iles Loyaute + - Nord + - Sud +New Zealand: + - Auckland + - Bay of Plenty + - Canterbury + - Gisborne + - Hawke's Bay + - Manawatu-Wanganui + - Marlborough + - Nelson + - Northland + - Otago + - Southland + - Taranaki + - Tasman + - Waikato + - Wellington + - West Coast +Nicaragua: + - Atlantico Norte + - Atlantico Sur + - Boaco + - Carazo + - Chinandega + - Chontales + - Esteli + - Granada + - Jinotega + - Leon + - Madriz + - Managua + - Masaya + - Matagalpa + - Nueva Segovia + - Rio San Juan + - Rivas +Niger: + - Agadez + - Diffa + - Dosso + - Maradi + - Niamey + - Tahoua + - Tillaberi + - Zinder +Nigeria: + - Abia + - Abuja Federal Capital Territory + - Adamawa + - Akwa Ibom + - Anambra + - Bauchi + - Bayelsa + - Benue + - Borno + - Cross River + - Delta + - Ebonyi + - Edo + - Ekiti + - Enugu + - Gombe + - Imo + - Jigawa + - Kaduna + - Kano + - Katsina + - Kebbi + - Kogi + - Kwara + - Lagos + - Nassarawa + - Niger + - Ogun + - Ondo + - Osun + - Oyo + - Plateau + - Rivers + - Sokoto + - Taraba + - Yobe + - Zamfara +Niue: + - Niue +Norfolk Island: + - Norfolk Island +Northern Mariana Islands: + - Northern Islands + - Rota + - Saipan + - Tinian +Norway: + - Akershus + - Aust-Agder + - Buskerud + - Finnmark + - Hedmark + - Hordaland + - More og Romsdal + - Nord-Trondelag + - Nordland + - Oppland + - Oslo + - Ostfold + - Rogaland + - Sogn og Fjordane + - Sor-Trondelag + - Telemark + - Troms + - Vest-Agder + - Vestfold +Oman: + - Ad Dakhiliyah + - Al Batinah + - Al Wusta + - Ash Sharqiyah + - Az Zahirah + - Masqat + - Musandam + - Zufar +Pakistan: + - Balochistan + - Federally Administered Tribal Areas + - Islamabad Capital Territory + - North-West Frontier Province + - Punjab + - Sindh +Palau: + - Aimeliik + - Airai + - Angaur + - Hatobohei + - Kayangel + - Koror + - Melekeok + - Ngaraard + - Ngarchelong + - Ngardmau + - Ngatpang + - Ngchesar + - Ngeremlengui + - Ngiwal + - Palau Island + - Peleliu + - Sonsoral + - Tobi +Panama: + - Bocas del Toro + - Chiriqui + - Cocle + - Colon + - Darien + - Herrera + - Los Santos + - Panama + - San Blas + - Veraguas +Papua New Guinea: + - Bougainville + - Central + - Chimbu + - East New Britain + - East Sepik + - Eastern Highlands + - Enga + - Gulf + - Madang + - Manus + - Milne Bay + - Morobe + - National Capital + - New Ireland + - Northern + - Sandaun + - Southern Highlands + - West New Britain + - Western + - Western Highlands +Paraguay: + - Alto Paraguay + - Alto Parana + - Amambay + - Asuncion (city) + - Boqueron + - Caaguazu + - Caazapa + - Canindeyu + - Central + - Concepcion + - Cordillera + - Guaira + - Itapua + - Misiones + - Neembucu + - Paraguari + - Presidente Hayes + - San Pedro +Peru: + - Amazonas + - Ancash + - Apurimac + - Arequipa + - Ayacucho + - Cajamarca + - Callao + - Cusco + - Huancavelica + - Huanuco + - Ica + - Junin + - La Libertad + - Lambayeque + - Lima + - Loreto + - Madre de Dios + - Moquegua + - Pasco + - Piura + - Puno + - San Martin + - Tacna + - Tumbes + - Ucayali +Philippines: + - Abra + - Agusan del Norte + - Agusan del Sur + - Aklan + - Albay + - Angeles + - Antique + - Aurora + - Bacolod + - Bago + - Baguio + - Bais + - Basilan + - Basilan City + - Bataan + - Batanes + - Batangas + - Batangas City + - Benguet + - Bohol + - Bukidnon + - Bulacan + - Butuan + - Cabanatuan + - Cadiz + - Cagayan + - Cagayan de Oro + - Calbayog + - Caloocan + - Camarines Norte + - Camarines Sur + - Camiguin + - Canlaon + - Capiz + - Catanduanes + - Cavite + - Cavite City + - Cebu + - Cebu City + - Cotabato + - Dagupan + - Danao + - Dapitan + - Davao City Davao + - Davao del Sur + - Davao Oriental + - Dipolog + - Dumaguete + - Eastern Samar + - General Santos + - Gingoog + - Ifugao + - Iligan + - Ilocos Norte + - Ilocos Sur + - Iloilo + - Iloilo City + - Iriga + - Isabela + - Kalinga-Apayao + - La Carlota + - La Union + - Laguna + - Lanao del Norte + - Lanao del Sur + - Laoag + - Lapu-Lapu + - Legaspi + - Leyte + - Lipa + - Lucena + - Maguindanao + - Mandaue + - Manila + - Marawi + - Marinduque + - Masbate + - Mindoro Occidental + - Mindoro Oriental + - Misamis Occidental + - Misamis Oriental + - Mountain + - Naga + - Negros Occidental + - Negros Oriental + - North Cotabato + - Northern Samar + - Nueva Ecija + - Nueva Vizcaya + - Olongapo + - Ormoc + - Oroquieta + - Ozamis + - Pagadian + - Palawan + - Palayan + - Pampanga + - Pangasinan + - Pasay + - Puerto Princesa + - Quezon + - Quezon City + - Quirino + - Rizal + - Romblon + - Roxas + - Samar + - San Carlos (in Negros Occidental) + - San Carlos (in Pangasinan) + - San Jose + - San Pablo + - Silay + - Siquijor + - Sorsogon + - South Cotabato + - Southern Leyte + - Sultan Kudarat + - Sulu + - Surigao + - Surigao del Norte + - Surigao del Sur + - Tacloban + - Tagaytay + - Tagbilaran + - Tangub + - Tarlac + - Tawitawi + - Toledo + - Trece Martires + - Zambales + - Zamboanga + - Zamboanga del Norte + - Zamboanga del Sur +Pitcairn Islands: + - Pitcaim Islands +Poland: + - Dolnoslaskie + - Kujawsko-Pomorskie + - Lodzkie + - Lubelskie + - Lubuskie + - Malopolskie + - Mazowieckie + - Opolskie + - Podkarpackie + - Podlaskie + - Pomorskie + - Slaskie + - Swietokrzyskie + - Warminsko-Mazurskie + - Wielkopolskie + - Zachodniopomorskie +Portugal: + - Acores (Azores) + - Aveiro + - Beja + - Braga + - Braganca + - Castelo Branco + - Coimbra + - Evora + - Faro + - Guarda + - Leiria + - Lisboa + - Madeira + - Portalegre + - Porto + - Santarem + - Setubal + - Viana do Castelo + - Vila Real + - Viseu +Puerto Rico: + - Adjuntas + - Aguada + - Aguadilla + - Aguas Buenas + - Aibonito + - Anasco + - Arecibo + - Arroyo + - Barceloneta + - Barranquitas + - Bayamon + - Cabo Rojo + - Caguas + - Camuy + - Canovanas + - Carolina + - Catano + - Cayey + - Ceiba + - Ciales + - Cidra + - Coamo + - Comerio + - Corozal + - Culebra + - Dorado + - Fajardo + - Florida + - Guanica + - Guayama + - Guayanilla + - Guaynabo + - Gurabo + - Hatillo + - Hormigueros + - Humacao + - Isabela + - Jayuya + - Juana Diaz + - Juncos + - Lajas + - Lares + - Las Marias + - Las Piedras + - Loiza + - Luquillo + - Manati + - Maricao + - Maunabo + - Mayaguez + - Moca + - Morovis + - Naguabo + - Naranjito + - Orocovis + - Patillas + - Penuelas + - Ponce + - Quebradillas + - Rincon + - Rio Grande + - Sabana Grande + - Salinas + - San German + - San Juan + - San Lorenzo + - San Sebastian + - Santa Isabel + - Toa Alta + - Toa Baja + - Trujillo Alto + - Utuado + - Vega Alta + - Vega Baja + - Vieques + - Villalba + - Yabucoa + - Yauco +Qatar: + - Ad Dawhah + - Al Ghuwayriyah + - Al Jumayliyah + - Al Khawr + - Al Wakrah + - Ar Rayyan + - Jarayan al Batinah + - Madinat ash Shamal + - Umm Salal +Reunion: + - Reunion +Romania: + - Alba + - Arad + - Argeș + - Bacău + - Bihor + - Bistrița-Năsăud + - Botoșani + - Brașov + - Brăila + - București + - Buzău + - Caraș-Severin + - Călărași + - Cluj + - Constanța + - Covasna + - Dâmbovița + - Dolj + - Galați + - Giurgiu + - Gorj + - Harghita + - Hunedoara + - Ialomița + - Iași + - Ilfov + - Maramureș + - Mehedinți + - Mureș + - Neamț + - Olt + - Prahova + - Satu Mare + - Sălaj + - Sibiu + - Suceava + - Teleorman + - Timiș + - Tulcea + - Vaslui + - Vâlcea + - Vrancea +Russia: + - Adygeya (Maykop) + - Aginskiy Buryatskiy (Aginskoye) + - Altay (Gorno-Altaysk) + - Altayskiy (Barnaul) + - Amurskaya (Blagoveshchensk) + - Arkhangel'skaya + - Astrakhanskaya + - Bashkortostan (Ufa) + - Belgorodskaya + - Bryanskaya + - Buryatiya (Ulan-Ude) + - Chechnya (Groznyy) + - Chelyabinskaya + - Chitinskaya + - Chukotskiy (Anadyr') + - Chuvashiya (Cheboksary) + - Dagestan (Makhachkala) + - Evenkiyskiy (Tura) + - Ingushetiya (Nazran') + - Irkutskaya + - Ivanovskaya + - Kabardino-Balkariya (Nal'chik) + - Kaliningradskaya + - Kalmykiya (Elista) + - Kaluzhskaya + - Kamchatskaya (Petropavlovsk-Kamchatskiy) + - Karachayevo-Cherkesiya (Cherkessk) + - Kareliya (Petrozavodsk) + - Kemerovskaya + - Khabarovskiy + - Khakasiya (Abakan) + - Khanty-Mansiyskiy (Khanty-Mansiysk) + - Kirovskaya + - Komi (Syktyvkar) + - Komi-Permyatskiy (Kudymkar) + - Koryakskiy (Palana) + - Kostromskaya + - Krasnodarskiy + - Krasnoyarskiy + - Kurganskaya + - Kurskaya + - Leningradskaya + - Lipetskaya + - Magadanskaya + - Mariy-El (Yoshkar-Ola) + - Mordoviya (Saransk) + - Moskovskaya + - Moskva (Moscow) + - Murmanskaya + - Nenetskiy (Nar'yan-Mar) + - Nizhegorodskaya + - Novgorodskaya + - Novosibirskaya + - Omskaya + - Orenburgskaya + - Orlovskaya (Orel) + - Penzenskaya + - Permskaya + - Primorskiy (Vladivostok) + - Pskovskaya + - Rostovskaya + - Ryazanskaya + - Sakha (Yakutsk) + - Sakhalinskaya (Yuzhno-Sakhalinsk) + - Samarskaya + - Sankt-Peterburg (Saint Petersburg) + - Saratovskaya + - Severnaya Osetiya-Alaniya [North Ossetia] (Vladikavkaz) + - Smolenskaya + - Stavropol'skiy + - Sverdlovskaya (Yekaterinburg) + - Tambovskaya + - Tatarstan (Kazan') + - Taymyrskiy (Dudinka) + - Tomskaya + - Tul'skaya + - Tverskaya + - Tyumenskaya + - Tyva (Kyzyl) + - Udmurtiya (Izhevsk) + - Ul'yanovskaya + - Ust'-Ordynskiy Buryatskiy (Ust'-Ordynskiy) + - Vladimirskaya + - Volgogradskaya + - Vologodskaya + - Voronezhskaya + - Yamalo-Nenetskiy (Salekhard) + - Yaroslavskaya + - Yevreyskaya +Rwanda: + - Butare + - Byumba + - Cyangugu + - Gikongoro + - Gisenyi + - Gitarama + - Kibungo + - Kibuye + - Kigali Rurale + - Kigali-ville + - Ruhengeri + - Umutara +Saint Helena: + - Ascension + - Saint Helena + - Tristan da Cunha +Saint Kitts and Nevis: + - Christ Church Nichola Town + - Saint Anne Sandy Point + - Saint George Basseterre + - Saint George Gingerland + - Saint James Windward + - Saint John Capisterre + - Saint John Figtree + - Saint Mary Cayon + - Saint Paul Capisterre + - Saint Paul Charlestown + - Saint Peter Basseterre + - Saint Thomas Lowland + - Saint Thomas Middle Island + - Trinity Palmetto Point +Saint Lucia: + - Anse-la-Raye + - Castries + - Choiseul + - Dauphin + - Dennery + - Gros Islet + - Laborie + - Micoud + - Praslin + - Soufriere + - Vieux Fort +Saint Pierre and Miquelon: + - Miquelon + - Saint Pierre +Saint Vincent and the Grenadines: + - Charlotte + - Grenadines + - Saint Andrew + - Saint David + - Saint George + - Saint Patrick +Samoa: + - A'ana + - Aiga-i-le-Tai + - Atua + - Fa'asaleleaga + - Gaga'emauga + - Gagaifomauga + - Palauli + - Satupa'itea + - Tuamasaga + - Va'a-o-Fonoti + - Vaisigano +San Marino: + - Acquaviva + - Borgo Maggiore + - Chiesanuova + - Domagnano + - Faetano + - Fiorentino + - Monte Giardino + - San Marino + - Serravalle +Sao Tome and Principe: + - Principe + - Sao Tome +Saudi Arabia: + - "'Asir" + - Al Bahah + - Al Hudud ash Shamaliyah + - Al Jawf + - Al Madinah + - Al Qasim + - Ar Riyad + - Ash Sharqiyah (Eastern Province) + - Ha'il + - Jizan + - Makkah + - Najran + - Tabuk +Scotland: + - Aberdeen City + - Aberdeenshire + - Angus + - Argyll and Bute + - City of Edinburgh + - Clackmannanshire + - Dumfries and Galloway + - Dundee City + - East Ayrshire + - East Dunbartonshire + - East Lothian + - East Renfrewshire + - Eilean Siar (Western Isles) + - Falkirk + - Fife + - Glasgow City + - Highland + - Inverclyde + - Midlothian + - Moray + - North Ayrshire + - North Lanarkshire + - Orkney Islands + - Perth and Kinross + - Renfrewshire + - Shetland Islands + - South Ayrshire + - South Lanarkshire + - Stirling + - The Scottish Borders + - West Dunbartonshire + - West Lothian +Senegal: + - Dakar + - Diourbel + - Fatick + - Kaolack + - Kolda + - Louga + - Saint-Louis + - Tambacounda + - Thies + - Ziguinchor +Serbia: + - Serbia +Seychelles: + - Anse aux Pins + - Anse Boileau + - Anse Etoile + - Anse Louis + - Anse Royale + - Baie Lazare + - Baie Sainte Anne + - Beau Vallon + - Bel Air + - Bel Ombre + - Cascade + - Glacis + - Grand' Anse (on Mahe) + - Grand' Anse (on Praslin) + - La Digue + - La Riviere Anglaise + - Mont Buxton + - Mont Fleuri + - Plaisance + - Pointe La Rue + - Port Glaud + - Saint Louis + - Takamaka +Sierra Leone: + - Eastern + - Northern + - Southern + - Western +Singapore: + - Singapore +Slovakia: + - Banskobystricky + - Bratislavsky + - Kosicky + - Nitriansky + - Presovsky + - Trenciansky + - Trnavsky + - Zilinsky +Slovenia: + - Ajdovscina + - Beltinci + - Bled + - Bohinj + - Borovnica + - Bovec + - Brda + - Brezice + - Brezovica + - Cankova-Tisina + - Celje + - Cerklje na Gorenjskem + - Cerknica + - Cerkno + - Crensovci + - Crna na Koroskem + - Crnomelj + - Destrnik-Trnovska Vas + - Divaca + - Dobrepolje + - Dobrova-Horjul-Polhov Gradec + - Dol pri Ljubljani + - Domzale + - Dornava + - Dravograd + - Duplek + - Gorenja Vas-Poljane + - Gorisnica + - Gornja Radgona + - Gornji Grad + - Gornji Petrovci + - Grosuplje + - Hodos Salovci + - Hrastnik + - Hrpelje-Kozina + - Idrija + - Ig + - Ilirska Bistrica + - Ivancna Gorica + - Izola + - Jesenice + - Jursinci + - Kamnik + - Kanal + - Kidricevo + - Kobarid + - Kobilje + - Kocevje + - Komen + - Koper + - Kozje + - Kranj + - Kranjska Gora + - Krsko + - Kungota + - Kuzma + - Lasko + - Lenart + - Lendava + - Litija + - Ljubljana + - Ljubno + - Ljutomer + - Logatec + - Loska Dolina + - Loski Potok + - Luce + - Lukovica + - Majsperk + - Maribor + - Medvode + - Menges + - Metlika + - Mezica + - Miren-Kostanjevica + - Mislinja + - Moravce + - Moravske Toplice + - Mozirje + - Murska Sobota + - Muta + - Naklo + - Nazarje + - Nova Gorica + - Novo Mesto + - Odranci + - Ormoz + - Osilnica + - Pesnica + - Piran + - Pivka + - Podcetrtek + - Podvelka-Ribnica + - Postojna + - Preddvor + - Ptuj + - Puconci + - Race-Fram + - Radece + - Radenci + - Radlje ob Dravi + - Radovljica + - Ravne-Prevalje + - Ribnica + - Rogasevci + - Rogaska Slatina + - Rogatec + - Ruse + - Semic + - Sencur + - Sentilj + - Sentjernej + - Sentjur pri Celju + - Sevnica + - Sezana + - Skocjan + - Skofja Loka + - Skofljica + - Slovenj Gradec + - Slovenska Bistrica + - Slovenske Konjice + - Smarje pri Jelsah + - Smartno ob Paki + - Sostanj + - Starse + - Store + - Sveti Jurij + - Tolmin + - Trbovlje + - Trebnje + - Trzic + - Turnisce + - Velenje + - Velike Lasce + - Videm + - Vipava + - Vitanje + - Vodice + - Vojnik + - Vrhnika + - Vuzenica + - Zagorje ob Savi + - Zalec + - Zavrc + - Zelezniki + - Ziri + - Zrece +Solomon Islands: + - Bellona + - Central + - Choiseul (Lauru) + - Guadalcanal + - Honiara + - Isabel + - Makira + - Malaita + - Rennell + - Temotu + - Western +Somalia: + - Awdal + - Bakool + - Banaadir + - Bari + - Bay + - Galguduud + - Gedo + - Hiiraan + - Jubbada Dhexe + - Jubbada Hoose + - Mudug + - Nugaal + - Sanaag + - Shabeellaha Dhexe + - Shabeellaha Hoose + - Sool + - Togdheer + - Woqooyi Galbeed +South Africa: + - Eastern Cape + - Free State + - Gauteng + - KwaZulu-Natal + - Mpumalanga + - North-West + - Northern Cape + - Northern Province + - Western Cape +South Georgia and South Sandwich Islands: + - Bird Island + - Bristol Island + - Clerke Rocks + - Montagu Island + - Saunders Island + - South Georgia + - Southern Thule + - Traversay Islands +Spain: + - Andalucia + - Aragon + - Asturias + - Baleares (Balearic Islands) + - Canarias (Canary Islands) + - Cantabria + - Castilla y Leon + - Castilla-La Mancha + - Cataluna + - Ceuta + - Communidad Valencian + - Extremadura + - Galicia + - Islas Chafarinas + - La Rioja + - Madrid + - Melilla + - Murcia + - Navarra + - Pais Vasco (Basque Country) + - Penon de Alhucemas + - Penon de Velez de la Gomera +Spratly Islands: + - Spratly Islands +Sri Lanka: + - Central + - Eastern + - North Central + - North Eastern + - North Western + - Northern + - Sabaragamuwa + - Southern + - Uva + - Western +Sudan: + - A'ali an Nil + - Al Bahr al Ahmar + - Al Buhayrat + - Al Jazirah + - Al Khartum + - Al Qadarif + - Al Wahdah + - An Nil al Abyad + - An Nil al Azraq + - Ash Shamaliyah + - Bahr al Jabal + - Gharb al Istiwa'iyah + - Gharb Bahr al Ghazal + - Gharb Darfur + - Gharb Kurdufan + - Janub Darfur + - Janub Kurdufan + - Junqali + - Kassala + - Nahr an Nil + - Shamal Bahr al Ghazal + - Shamal Darfur + - Shamal Kurdufan + - Sharq al Istiwa'iyah + - Sinnar + - Warab +Suriname: + - Brokopondo + - Commewijne + - Coronie + - Marowijne + - Nickerie + - Para + - Paramaribo + - Saramacca + - Sipaliwini + - Wanica +Svalbard: + - Barentsoya + - Bjornoya + - Edgeoya + - Hopen + - Kvitoya + - Nordaustandet + - Prins Karls Forland + - Spitsbergen +Swaziland: + - Hhohho + - Lubombo + - Manzini + - Shiselweni +Sweden: + - Blekinge + - Dalarnas + - Gavleborgs + - Gotlands + - Hallands + - Jamtlands + - Jonkopings + - Kalmar + - Kronobergs + - Norrbottens + - Orebro + - Ostergotlands + - Skane + - Sodermanlands + - Stockholms + - Uppsala + - Varmlands + - Vasterbottens + - Vasternorrlands + - Vastmanlands + - Vastra Gotalands +Switzerland: + - Aargau + - Ausser-Rhoden + - Basel-Landschaft + - Basel-Stadt + - Bern + - Fribourg + - Geneve + - Glarus + - Graubunden + - Inner-Rhoden + - Jura + - Luzern + - Neuchatel + - Nidwalden + - Obwalden + - Sankt Gallen + - Schaffhausen + - Schwyz + - Solothurn + - Thurgau + - Ticino + - Uri + - Valais + - Vaud + - Zug + - Zurich +Syria: + - Al Hasakah + - Al Ladhiqiyah + - Al Qunaytirah + - Ar Raqqah + - As Suwayda' + - Dar'a + - Dayr az Zawr + - Dimashq + - Halab + - Hamah + - Hims + - Idlib + - Rif Dimashq + - Tartus +Taiwan: + - Chang-hua + - Chi-lung + - Chia-i + - Chia-i + - Chung-hsing-hsin-ts'un + - Hsin-chu + - Hsin-chu + - Hua-lien + - I-lan + - Kao-hsiung + - Kao-hsiung + - Miao-li + - Nan-t'ou + - P'eng-hu + - P'ing-tung + - T'ai-chung + - T'ai-chung + - T'ai-nan + - T'ai-nan + - T'ai-pei + - T'ai-pei + - T'ai-tung + - T'ao-yuan + - Yun-lin +Tajikistan: + - Viloyati Khatlon + - Viloyati Leninobod + - Viloyati Mukhtori Kuhistoni Badakhshon +Tanzania: + - Arusha + - Dar es Salaam + - Dodoma + - Iringa + - Kagera + - Kigoma + - Kilimanjaro + - Lindi + - Mara + - Mbeya + - Morogoro + - Mtwara + - Mwanza + - Pemba North + - Pemba South + - Pwani + - Rukwa + - Ruvuma + - Shinyanga + - Singida + - Tabora + - Tanga + - Zanzibar Central/South + - Zanzibar North + - Zanzibar Urban/West +Thailand: + - Amnat Charoen + - Ang Thong + - Buriram + - Chachoengsao + - Chai Nat + - Chaiyaphum + - Chanthaburi + - Chiang Mai + - Chiang Rai + - Chon Buri + - Chumphon + - Kalasin + - Kamphaeng Phet + - Kanchanaburi + - Khon Kaen + - Krabi + - Krung Thep Mahanakhon (Bangkok) + - Lampang + - Lamphun + - Loei + - Lop Buri + - Mae Hong Son + - Maha Sarakham + - Mukdahan + - Nakhon Nayok + - Nakhon Pathom + - Nakhon Phanom + - Nakhon Ratchasima + - Nakhon Sawan + - Nakhon Si Thammarat + - Nan + - Narathiwat + - Nong Bua Lamphu + - Nong Khai + - Nonthaburi + - Pathum Thani + - Pattani + - Phangnga + - Phatthalung + - Phayao + - Phetchabun + - Phetchaburi + - Phichit + - Phitsanulok + - Phra Nakhon Si Ayutthaya + - Phrae + - Phuket + - Prachin Buri + - Prachuap Khiri Khan + - Ranong + - Ratchaburi + - Rayong + - Roi Et + - Sa Kaeo + - Sakon Nakhon + - Samut Prakan + - Samut Sakhon + - Samut Songkhram + - Sara Buri + - Satun + - Sing Buri + - Sisaket + - Songkhla + - Sukhothai + - Suphan Buri + - Surat Thani + - Surin + - Tak + - Trang + - Trat + - Ubon Ratchathani + - Udon Thani + - Uthai Thani + - Uttaradit + - Yala + - Yasothon +Tobago: + - Tobago +Togo: + - De La Kara + - Des Plateaux + - Des Savanes + - Du Centre + - Maritime +Tokelau: + - Atafu + - Fakaofo + - Nukunonu +Tonga: + - Ha'apai + - Tongatapu + - Vava'u +Trinidad: + - Arima + - Caroni + - Mayaro + - Nariva + - Port-of-Spain + - Saint Andrew + - Saint David + - Saint George + - Saint Patrick + - San Fernando + - Victoria +Tunisia: + - Ariana + - Beja + - Ben Arous + - Bizerte + - El Kef + - Gabes + - Gafsa + - Jendouba + - Kairouan + - Kasserine + - Kebili + - Mahdia + - Medenine + - Monastir + - Nabeul + - Sfax + - Sidi Bou Zid + - Siliana + - Sousse + - Tataouine + - Tozeur + - Tunis + - Zaghouan +Turkey: + - Adana + - Adiyaman + - Afyon + - Agri + - Aksaray + - Amasya + - Ankara + - Antalya + - Ardahan + - Artvin + - Aydin + - Balikesir + - Bartin + - Batman + - Bayburt + - Bilecik + - Bingol + - Bitlis + - Bolu + - Burdur + - Bursa + - Canakkale + - Cankiri + - Corum + - Denizli + - Diyarbakir + - Duzce + - Edirne + - Elazig + - Erzincan + - Erzurum + - Eskisehir + - Gaziantep + - Giresun + - Gumushane + - Hakkari + - Hatay + - Icel + - Igdir + - Isparta + - Istanbul + - Izmir + - Kahramanmaras + - Karabuk + - Karaman + - Kars + - Kastamonu + - Kayseri + - Kilis + - Kirikkale + - Kirklareli + - Kirsehir + - Kocaeli + - Konya + - Kutahya + - Malatya + - Manisa + - Mardin + - Mugla + - Mus + - Nevsehir + - Nigde + - Ordu + - Osmaniye + - Rize + - Sakarya + - Samsun + - Sanliurfa + - Siirt + - Sinop + - Sirnak + - Sivas + - Tekirdag + - Tokat + - Trabzon + - Tunceli + - Usak + - Van + - Yalova + - Yozgat + - Zonguldak +Turkmenistan: + - Ahal Welayaty + - Balkan Welayaty + - Dashhowuz Welayaty + - Lebap Welayaty + - Mary Welayaty +Tuvalu: + - Tuvalu +Uganda: + - Adjumani + - Apac + - Arua + - Bugiri + - Bundibugyo + - Bushenyi + - Busia + - Gulu + - Hoima + - Iganga + - Jinja + - Kabale + - Kabarole + - Kalangala + - Kampala + - Kamuli + - Kapchorwa + - Kasese + - Katakwi + - Kibale + - Kiboga + - Kisoro + - Kitgum + - Kotido + - Kumi + - Lira + - Luwero + - Masaka + - Masindi + - Mbale + - Mbarara + - Moroto + - Moyo + - Mpigi + - Mubende + - Mukono + - Nakasongola + - Nebbi + - Ntungamo + - Pallisa + - Rakai + - Rukungiri + - Sembabule + - Soroti + - Tororo +Ukraine: + - Avtonomna Respublika Krym (Simferopol') + - Cherkas'ka (Cherkasy) + - Chernihivs'ka (Chernihiv) + - Chernivets'ka (Chernivtsi) + - Dnipropetrovs'ka (Dnipropetrovs'k) + - Donets'ka (Donets'k) + - Ivano-Frankivs'ka (Ivano-Frankivs'k) + - Kharkivs'ka (Kharkiv) + - Khersons'ka (Kherson) + - Khmel'nyts'ka (Khmel'nyts'kyy) + - Kirovohrads'ka (Kirovohrad) + - Kyiv + - Kyivs'ka (Kiev) + - L'vivs'ka (L'viv) + - Luhans'ka (Luhans'k) + - Mykolayivs'ka (Mykolayiv) + - Odes'ka (Odesa) + - Poltavs'ka (Poltava) + - Rivnens'ka (Rivne) + - Sevastopol' + - Sums'ka (Sumy) + - Ternopil's'ka (Ternopil') + - Vinnyts'ka (Vinnytsya) + - Volyns'ka (Luts'k) + - Zakarpats'ka (Uzhhorod) + - Zaporiz'ka (Zaporizhzhya) + - Zhytomyrs'ka (Zhytomyr) +United Arab Emirates: + - "'Ajman" + - Abu Zaby (Abu Dhabi) + - Al Fujayrah + - Ash Shariqah (Sharjah) + - Dubayy (Dubai) + - Ra's al Khaymah + - Umm al Qaywayn +United Kingdom: + - Barking and Dagenham + - Barnet + - Barnsley + - Bath and North East Somerset + - Bedfordshire + - Bexley + - Birmingham + - Blackburn with Darwen + - Blackpool + - Bolton + - Bournemouth + - Bracknell Forest + - Bradford + - Brent + - Brighton and Hove + - Bromley + - Buckinghamshire + - Bury + - Calderdale + - Cambridgeshire + - Camden + - Cheshire + - City of Bristol + - City of Kingston upon Hull + - City of London + - Cornwall + - Coventry + - Croydon + - Cumbria + - Darlington + - Derby + - Derbyshire + - Devon + - Doncaster + - Dorset + - Dudley + - Durham + - Ealing + - East Riding of Yorkshire + - East Sussex + - Enfield + - Essex + - Gateshead + - Gloucestershire + - Greenwich + - Hackney + - Halton + - Hammersmith and Fulham + - Hampshire + - Haringey + - Harrow + - Hartlepool + - Havering + - Herefordshire + - Hertfordshire + - Hillingdon + - Hounslow + - Isle of Wight + - Islington + - Kensington and Chelsea + - Kent + - Kingston upon Thames + - Kirklees + - Knowsley + - Lambeth + - Lancashire + - Leeds + - Leicester + - Leicestershire + - Lewisham + - Lincolnshire + - Liverpool + - Luton + - Manchester + - Medway + - Merton + - Middlesbrough + - Milton Keynes + - Newcastle upon Tyne + - Newham + - Norfolk + - North East Lincolnshire + - North Lincolnshire + - North Somerset + - North Tyneside + - North Yorkshire + - Northamptonshire + - Northumberland + - Nottingham + - Nottinghamshire + - Oldham + - Oxfordshire + - Peterborough + - Plymouth + - Poole + - Portsmouth + - Reading + - Redbridge + - Redcar and Cleveland + - Richmond upon Thames + - Rochdale + - Rotherham + - Rutland + - Salford + - Sandwell + - Sefton + - Sheffield + - Shropshire + - Slough + - Solihull + - Somerset + - South Gloucestershire + - South Tyneside + - Southampton + - Southend-on-Sea + - Southwark + - St. Helens + - Staffordshire + - Stockport + - Stockton-on-Tees + - Stoke-on-Trent + - Suffolk + - Sunderland + - Surrey + - Sutton + - Swindon + - Tameside + - Telford and Wrekin + - Thurrock + - Torbay + - Tower Hamlets + - Trafford + - Wakefield + - Walsall + - Waltham Forest + - Wandsworth + - Warrington + - Warwickshire + - West Berkshire + - West Sussex + - Westminster + - Wigan + - Wiltshire + - Windsor and Maidenhead + - Wirral + - Wokingham + - Wolverhampton + - Worcestershire + - York +Uruguay: + - Artigas + - Canelones + - Cerro Largo + - Colonia + - Durazno + - Flores + - Florida + - Lavalleja + - Maldonado + - Montevideo + - Paysandu + - Rio Negro + - Rivera + - Rocha + - Salto + - San Jose + - Soriano + - Tacuarembo + - Treinta y Tres +United States of America: + - Alabama + - Alaska + - Arizona + - Arkansas + - California + - Colorado + - Connecticut + - Delaware + - District of Columbia + - Florida + - Georgia + - Hawaii + - Idaho + - Illinois + - Indiana + - Iowa + - Kansas + - Kentucky + - Louisiana + - Maine + - Maryland + - Massachusetts + - Michigan + - Minnesota + - Mississippi + - Missouri + - Montana + - Nebraska + - Nevada + - New Hampshire + - New Jersey + - New Mexico + - New York + - North Carolina + - North Dakota + - Ohio + - Oklahoma + - Oregon + - Pennsylvania + - Rhode Island + - South Carolina + - South Dakota + - Tennessee + - Texas + - Utah + - Vermont + - Virginia + - Washington + - West Virginia + - Wisconsin + - Wyoming +Uzbekistan: + - Andijon Wiloyati + - Bukhoro Wiloyati + - Farghona Wiloyati + - Jizzakh Wiloyati + - Khorazm Wiloyati (Urganch) + - Namangan Wiloyati + - Nawoiy Wiloyati + - Qashqadaryo Wiloyati (Qarshi) + - Qoraqalpoghiston (Nukus) + - Samarqand Wiloyati + - Sirdaryo Wiloyati (Guliston) + - Surkhondaryo Wiloyati (Termiz) + - Toshkent Shahri + - Toshkent Wiloyati +Vanuatu: + - Malampa + - Penama + - Sanma + - Shefa + - Tafea + - Torba +Venezuela: + - Amazonas + - Anzoategui + - Apure + - Aragua + - Barinas + - Bolivar + - Carabobo + - Cojedes + - Delta Amacuro + - Dependencias Federales + - Distrito Federal + - Falcon + - Guarico + - Lara + - Merida + - Miranda + - Monagas + - Nueva Esparta + - Portuguesa + - Sucre + - Tachira + - Trujillo + - Vargas + - Yaracuy + - Zulia +Vietnam: + - An Giang + - Ba Ria-Vung Tau + - Bac Giang + - Bac Kan + - Bac Lieu + - Bac Ninh + - Ben Tre + - Binh Dinh + - Binh Duong + - Binh Phuoc + - Binh Thuan + - Ca Mau + - Can Tho + - Cao Bang + - Da Nang + - Dac Lak + - Dong Nai + - Dong Thap + - Gia Lai + - Ha Giang + - Ha Nam + - Ha Noi + - Ha Tay + - Ha Tinh + - Hai Duong + - Hai Phong + - Ho Chi Minh + - Hoa Binh + - Hung Yen + - Khanh Hoa + - Kien Giang + - Kon Tum + - Lai Chau + - Lam Dong + - Lang Son + - Lao Cai + - Long An + - Nam Dinh + - Nghe An + - Ninh Binh + - Ninh Thuan + - Phu Tho + - Phu Yen + - Quang Binh + - Quang Nam + - Quang Ngai + - Quang Ninh + - Quang Tri + - Soc Trang + - Son La + - Tay Ninh + - Thai Binh + - Thai Nguyen + - Thanh Hoa + - Thua Thien-Hue + - Tien Giang + - Tra Vinh + - Tuyen Quang + - Vinh Long + - Vinh Phuc + - Yen Bai +Virgin Islands: + - Saint Croix + - Saint John + - Saint Thomas +Wales: + - Blaenau Gwent + - Bridgend + - Caerphilly + - Cardiff + - Carmarthenshire + - Ceredigion + - Conwy + - Denbighshire + - Flintshire + - Gwynedd + - Isle of Anglesey + - Merthyr Tydfil + - Monmouthshire + - Neath Port Talbot + - Newport + - Pembrokeshire + - Powys + - Rhondda Cynon Taff + - Swansea + - The Vale of Glamorgan + - Torfaen + - Wrexham +Wallis and Futuna: + - Alo + - Sigave + - Wallis +West Bank: + - West Bank +Western Sahara: + - Western Sahara +Yemen: + - "'Adan" + - "'Ataq" + - Abyan + - Al Bayda' + - Al Hudaydah + - Al Jawf + - Al Mahrah + - Al Mahwit + - Dhamar + - Hadhramawt + - Hajjah + - Ibb + - Lahij + - Ma'rib + - Sa'dah + - San'a' + - Ta'izz +Zambia: + - Central + - Copperbelt + - Eastern + - Luapula + - Lusaka + - North-Western + - Northern + - Southern + - Western +Zimbabwe: + - Bulawayo + - Harare + - ManicalandMashonaland Central + - Mashonaland East + - Mashonaland West + - Masvingo + - Matabeleland North + - Matabeleland South + - Midlands diff --git a/source/_data/glossary.yml b/source/_data/glossary.yml index af8e517f322..3e0dcb6c893 100644 --- a/source/_data/glossary.yml +++ b/source/_data/glossary.yml @@ -3,20 +3,30 @@ # Format is a list of terms, each term is a dictionary with the following keys: # - term: The term to define (required) # - definition: The definition of the term (required) -# - excerpt: Short excerpt of the definition, overrides definition for tooltips (optional) +# - excerpt: Short excerpt of the definition, overrides definition for tooltips +# (optional) # - link: A URL to link to for more information (optional) # - aliases: A list of aliases for the term (optional) # - term: Action definition: |- - Actions are used in several places in Home Assistant. As part of a script or automation, actions define what is going to happen once a trigger is activated. In scripts, an action is called *sequence*. - Actions use service calls and/or scenes to interact with entities and cause these entities to do something. Actions can also include conditions and a delay. An action can call multiple services at the same time. For example, if your presence is detected in a room, an action may call one service to turn on a light and call another service to start playing music after a delay. - Actions are also used on the dashboard, for example as tap or hold action on a UI element. When triggered, the action calls a service. + Actions are used in several places in Home Assistant. As part of a script or + automation, actions define what is going to happen once a trigger is + activated. In scripts, an action is called *sequence*. Actions use service + calls and/or scenes to interact with entities and cause these entities to do + something. Actions can also include conditions and a delay. An action can + call multiple services at the same time. For example, if your presence is + detected in a room, an action may call one service to turn on a light and + call another service to start playing music after a delay. Actions are also + used on the dashboard, for example as tap or hold action on a UI element. + When triggered, the action calls a service. aliases: - actions link: /docs/automation/action/ excerpt: > - Actions are used in several places in Home Assistant. As part of a script or automation, actions define what is going to happen once a trigger is activated. In scripts, an action is called *sequence*. + Actions are used in several places in Home Assistant. As part of a script or + automation, actions define what is going to happen once a trigger is + activated. In scripts, an action is called *sequence*. - term: Add-on definition: >- Add-ons are additional standalone third-party software packages that can be @@ -28,21 +38,29 @@ installed on Home Assistant OS. - term: Area definition: >- - Locations within your home such as living room, dance floor, etc. - Devices can be associated to an area for easier sorting and automatically - generated cards, such as the [Area card](/dashboards/area/). + An area in Home Assistant is a logical grouping of devices and entities that + are meant to match areas (or rooms) in the physical world: your home. For + example, the `living room` area groups devices and entities in your living + room. Areas allow you to target service calls at an entire group of devices. + For example, turning off all the lights in the living room. Locations within + your home such as living room, dance floor, etc. Areas can be assigned to + floors. Areas can also be used for automatically generated cards, such as + the [Area card](/dashboards/area/). excerpt: >- - Places within your home such as rooms, spaces, etc. + An area in Home Assistant is a logical grouping of devices and entities that + are meant to match areas (or rooms) in the physical world: your home. For + example, the `living room` area groups devices and entities in your living + room. aliases: - areas - term: Automation definition: >- - Automations connect one or more triggers to one or more actions in a - 'when trigger then do action' fashion with additional optional conditions. - For example, an automation might connect the trigger 'sunset' to the action + Automations connect one or more triggers to one or more actions in a 'when + trigger then do action' fashion with additional optional conditions. For + example, an automation might connect the trigger 'sunset' to the action 'turn the lights on' but only if the condition 'someone is home' is met. - Pre-made automations for common use-cases are available via - [the blueprints feature](/docs/automation/using_blueprints/). + Pre-made automations for common use-cases are available via [the blueprints + feature](/docs/automation/using_blueprints/). excerpt: >- Automations in Home Assistant allow you to automatically respond to things that happen in and around your home. @@ -51,14 +69,14 @@ - automations - term: Backup definition: >- - Home Assistant has built-in functionality to create files containing a copy of - your configuration. This can be used to restore your Home Assistant as well - as migrate to a new system. The backup feature is available on some installation - types. + Home Assistant has built-in functionality to create files containing a copy + of your configuration. This can be used to restore your Home Assistant as + well as migrate to a new system. The backup feature is available on some + installation types. link: /integrations/backup/ excerpt: >- - Home Assistant has built-in functionality to create files containing a copy of - your configurations. This is available on certain installation types. + Home Assistant has built-in functionality to create files containing a copy + of your configurations. This is available on certain installation types. aliases: - backups - term: Binary sensor @@ -68,41 +86,92 @@ link: /integrations/binary_sensor - 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 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. + 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 + 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 configuration-specific settings. + 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 + configuration-specific settings. aliases: - blueprints +- term: Category + definition: >- + A category is an organization tool that allows grouping items in a table. + Like labels, categories allow grouping irrespective of the items' physical + location. For example, on the automations page, you can create the + categories “Notifications” or “NFC tags” to view your automations grouped or + filtered. Categories are unique for each table. The automations page can + have different categories than the scene, scripts, or helpers settings page. + aliases: + - categories +- term: Commissioning + definition: >- + In the context of Matter devices, *commissioning* is the process of adding a + device to a Matter controller. It is the equivalent of pairing a device in + Zigbee or Z-Wave. Commissioning is done by scanning a QR code or entering a + code manually. The code is printed on the device or its packaging. The code + contains information about the device, such as its type, manufacturer, and + serial number. The controller uses this information to identify the device + and to download the required information to control the device. For example, + the controller downloads the device's capabilities, such as the supported + commands and the available attributes. The controller also downloads the + device's configuration, such as the device's name and location. + link: /integrations/matter/ + aliases: + - commission + excerpt: > + In the context of Matter devices, *commissioning* is the process of adding a + device to a Matter controller. It is the equivalent of pairing a device in + Zigbee or Z-Wave. - term: Component definition: >- Better known as: Integrations. Integrations used to be known as components. - term: Condition definition: >- - Conditions are an optional part of an automation that will prevent an - action from firing if they are not met. + Conditions are an optional part of an automation that will prevent an action + from firing if they are not met. link: /docs/scripts/conditions/ aliases: - conditions +- term: Configuration file + aliases: + - configuration.yaml + - "`configuration.yaml`" + definition: >- + The configuration.yaml file is the main configuration file for Home Assistant. It lists the integrations to be loaded and their specific configurations. In some cases, the configuration needs to be edited manually directly in the configuration.yaml file. Most integrations can be configured in the UI. + link: /docs/configuration/ - term: Cover definition: >- - Covers are devices such as blinds, garage doors, etc that can be opened - and closed and optionally set to a specific position. + 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 - term: Customize definition: >- - Customization allows you to overwrite the default parameters of your - devices in the configuration. + Customization allows you to overwrite the default parameters of your devices + in the configuration. - term: Device definition: |- - A device is a model representing a physical or logical unit that contains entities. - **Example for a device as a physical unit** - A smart plug named 'Coffee machine' which provides 2 entities: a `switch` entity to turn power on or off ('Coffee machine power switch') and a `sensor` entity for power monitoring ('Coffee machine power sensor'). - **Example for a device as a logical unit** - An ecobee thermostat with 4 room sensors. This thermostat is seen as 5 devices in Home Assistant: 1 device for the thermostat with 4 sensors, and 1 device for each room sensor. Each device can be in a different area and may have more than one input or output within that area. - Devices have properties such as ID, manufacturer, name, model, hardware version, firmware version, connections, etc. + A device is a model representing a physical or logical unit that contains + entities. **Example for a device as a physical unit** A smart plug named + 'Coffee machine' which provides 2 entities: a `switch` entity to turn power + on or off ('Coffee machine power switch') and a `sensor` entity for power + monitoring ('Coffee machine power sensor'). **Example for a device as a + logical unit** An ecobee thermostat with 4 room sensors. This thermostat is + seen as 5 devices in Home Assistant: 1 device for the thermostat with 4 + sensors, and 1 device for each room sensor. Each device can be in a + different area and may have more than one input or output within that area. + Devices have properties such as ID, manufacturer, name, model, hardware + version, firmware version, connections, etc. excerpt: > - A device is a model representing a physical or logical unit that contains entities. + A device is a model representing a physical or logical unit that contains + entities. aliases: - devices - term: Device tracker @@ -115,35 +184,43 @@ they are discovered. - term: Domain definition: >- - Each integration in Home Assistant has a unique identifier: - a domain. All of the entities and services available in Home Assistant - are provided by integrations and thus belong to such a domain. The first - part of the entity or service, before the `.` shows the domain they belong - to. For example `light.kitchen` is an entity in the `light` domain from - the [light integration](/integrations/light), while `hue.activate_scene` - is the `activate_scene` service for the `hue` domain which belongs to - the [Hue integration](/integrations/hue). + Each integration in Home Assistant has a unique identifier: a domain. All of + the entities and services available in Home Assistant are provided by + integrations and thus belong to such a domain. The first part of the entity + or service, before the `.` shows the domain they belong to. For example + `light.kitchen` is an entity in the `light` domain from the [light + integration](/integrations/light), while `hue.activate_scene` is the + `activate_scene` service for the `hue` domain which belongs to the [Hue + integration](/integrations/hue). excerpt: > - Each integration in Home Assistant has a unique identifier: The domain. - It is often shown as the first part (before the dot) of entity IDs. + Each integration in Home Assistant has a unique identifier: The domain. It + is often shown as the first part (before the dot) of entity IDs. aliases: - domains - term: Entity definition: |- - An entity represents a 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 device or a service. Entities have states. - **Example for entities as part of a device** - A combined temperature and humidity sensor device provides two sensor entities. One for temperature (e.g. `sensor.temperature` with state `21.0` and unit `°C`) and one for humidity - (e.g. `sensor.humidity` with state `65.4` and unit `%`). - **Example for entities as part of a service** - A weather service that provides 3 entities: wind speed, air pressure, and ozon level. - **Example of an entity used for control** - A fan that is turned on when the temperature exceeds 30 °C. - There are standardized types of entities for common integrations such as light, switch, camera, sensor, fan, or vacuum. - Some entities are not part of a device or service. Examples of standalone entities are automation, script, scene entities, and helper entities (e.g. input helpers). - Most properties of entities are related to the state. Entities have optional attributes such as friendly name, unit of measurement, and an icon or picture that can be displayed in the frontend. + An entity represents a 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 device or a service. Entities have + states. **Example for entities as part of a device** A combined temperature + and humidity sensor device provides two sensor entities. One for temperature + (e.g. `sensor.temperature` with state `21.0` and unit `°C`) and one for + humidity (e.g. `sensor.humidity` with state `65.4` and unit `%`). **Example + for entities as part of a service** A weather service that provides 3 + entities: wind speed, air pressure, and ozon level. **Example of an entity + used for control** A fan that is turned on when the temperature exceeds + 30 °C. There are standardized types of entities for common integrations + such as light, switch, camera, sensor, fan, or vacuum. Some entities are not + part of a device or service. Examples of standalone entities are automation, + script, scene entities, and helper entities (e.g. input helpers). Most + properties of entities are related to the state. Entities have optional + attributes such as friendly name, unit of measurement, and an icon or + picture that can be displayed in the frontend. link: /docs/configuration/state_object/ excerpt: > - An entity represents a 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 device or a service. + An entity represents a 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 device or a service. aliases: - entities - term: Event @@ -152,10 +229,28 @@ link: /docs/configuration/events/ aliases: - events +- term: Floor + definition: >- + A floor in Home Assistant is a logical grouping of areas that are meant to + match the physical floors in your home. Devices & entities are not assigned + to floors but to areas. A floor has properties such as: Floor ID, name, + aliases (for use in assistants), an icon, and a floor level. Some of these + properties are optional. The level number can be negative to reflect floors + below the basement. Floors can be used in automations and scripts as a + target for actions. For example, to turn off all the lights on the + downstairs floor when you go to bed. + excerpt: >- + A floor in Home Assistant is a logical grouping of areas that are meant to + match the physical floors in your home. Devices & entities are not assigned + to floors but to areas. Floors can be used in automations and scripts as a + target for actions. For example, to turn off all the lights on the + downstairs floor when you go to bed. + aliases: + - floors - term: Frontend definition: >- - The frontend is a necessary component for the UI, it is also where you - can define your themes. + The frontend is a necessary component for the UI, it is also where you can + define your themes. link: /integrations/frontend/ - term: Group definition: >- @@ -165,66 +260,90 @@ - groups - term: HASS definition: >- - HASS or [hass](/docs/tools/hass/) is often used as an abbreviation for - Home Assistant. It is also the command-line tool. + HASS or [hass](/docs/tools/hass/) is often used as an abbreviation for Home + Assistant. It is also the command-line tool. - term: HassOS definition: >- Another name for Home Assistant Operating System link: /hassio/installation/ +- term: Home Assistant Container + definition: >- + Home Assistant Container is a standalone container-based installation of + Home Assistant Core. Any [OCI](https://opencontainers.org/) compatible + runtime can be used, but the documentation focus is on Docker. + link: /installation/#advanced-installation-methods - term: Home Assistant Core definition: >- - Home Assistant Core is a Python program. It can be run on various operating - systems and is the basis for Home Assistant. When people are talking about - Home Assistant Core they usually refer to a standalone installation method - that can be installed using a Virtual Environment or Docker. Home Assistant - Core does not use the Home Assistant Supervisor. + Home Assistant Core is the Python program at the heart of Home Assistant. It + is part of all of the four installation types and can be run on various + operating systems. It can be installed standalone (without Home Assistant + Supervisor), using a Virtual Environment (typically referred to as Home + Assistant Core installation method) or as a container using Docker + (typically referred to as Home Assistant Container installation method). + link: /installation/#advanced-installation-methods excerpt: > - Home Assistant Core is the hart of Home Assistant itself. It is a Python - program that powers every installation type, but can be installed standalone. + Home Assistant Core is the heart of Home Assistant itself. It is a Python + program that powers every installation type, but can be installed + standalone. - term: Home Assistant Supervised definition: >- - Home Assistant Supervised is a full UI managed home automation ecosystem that - runs Home Assistant, the Home Assistant Supervisor and add-ons. It comes - pre-installed on Home Assistant OS, but can be installed on any Linux system. - It leverages Docker, which is managed by the Home Assistant Supervisor. + Home Assistant Supervised is a full UI managed home automation ecosystem + that runs the Home Assistant Core program, the Home Assistant Supervisor and + add-ons. It comes pre-installed on Home Assistant OS, but can be installed + standalone on Debian Linux systems. It leverages Docker, which is managed by + the Home Assistant Supervisor. excerpt: > Home Assistant Supervised is the full Home Assistant ecosystem, without the Home Assistant Operating System. + link: /installation/#advanced-installation-methods - term: Home Assistant Supervisor definition: >- The Home Assistant Supervisor is a program that manages a Home Assistant installation, taking care of installing and updating Home Assistant, - add-ons, itself and, if used, updating the Home Assistant Operating System. + add-ons, itself, and, if used, updating the Home Assistant Operating System. + link: /installation/#advanced-installation-methods - term: Home Assistant Operating System definition: >- Home Assistant OS, the Home Assistant Operating System, is an embedded, minimalistic, operating system designed to run the Home Assistant ecosystem - on single board computers (like the Raspberry Pi) or Virtual Machines. - The Home Assistant Supervisor can keep it up to date, removing the need for - you to manage an operating system. + on single board computers (like the Raspberry Pi) or Virtual Machines. It + includes Home Assistant Core, the Home Assistant Supervisor, and supports + add-ons. Home Assistant Supervisor keeps it up to date, removing the need + for you to manage an operating system. Home Assistant Operating System is + the recommended installation method for most users. excerpt: > Home Assistant OS, the Home Assistant Operating System, is an embedded, minimalistic, operating system designed to run the Home Assistant ecosystem. + It is the recommended installation method for most users. + link: /installation/#advanced-installation-methods - term: Host definition: >- - A device that can communicate with other devices on a network. During setup and configuration, - an input requesting a **Host** typically refers to a device's network address so that - Home Assistant can attempt to connect to it. This may be in the form of a hostname, URL, - IP address or some other type of network identifier. If you do not know the hostname or IP address of a device, you can find it in your router's webinterface. For example, if your device is connected wirelessly, somewhere there is a page listing all the devices that are connected to your network. It depends on your router, where exactly this page is. It could be under **Network** > **Wireless**. + A device that can communicate with other devices on a network. During setup + and configuration, an input requesting a **Host** typically refers to a + device's network address so that Home Assistant can attempt to connect to + it. This may be in the form of a hostname, URL, IP address or some other + type of network identifier. If you do not know the hostname or IP address of + a device, you can find it in your router's webinterface. For example, if + your device is connected wirelessly, somewhere there is a page listing all + the devices that are connected to your network. It depends on your router, + where exactly this page is. It could be under **Network** > **Wireless**. excerpt: >- - A device that participates in your network. If asked for the host, enter either the device's IP address or host name. If you don't know those, check the list of hosts in your router. + A device that participates in your network. If asked for the host, enter + either the device's IP address or host name. If you don't know those, check + the list of hosts in your router. link: https://en.wikipedia.org/wiki/Host_(network) aliases: - hosts - term: Integration definition: >- Integrations connect and integrate Home Assistant with devices, services, - and more. They contain all the logic to handle - vendor- and device-specific implementations, such as authentication or - specific protocols. The integration brings such device-specific elements into Home Assistant in a standardized - way. For example, the [Hue](/integrations/hue) integration integrates - the Philips Hue bridge and its connected bulbs into Home Assistant, making - them available as Home Assistant light entities you can control. + and more. They contain all the logic to handle vendor- and device-specific + implementations, such as authentication or specific protocols. The + integration brings such device-specific elements into Home Assistant in a + standardized way. For example, the [Hue](/integrations/hue) integration + integrates the Philips Hue bridge and its connected bulbs into Home + Assistant, making them available as Home Assistant light entities you can + control. excerpt: > Integrations connect and integrate Home Assistant with your devices, services, and more. @@ -233,17 +352,40 @@ - integrations - term: Intent definition: >- - Intent is a term used with voice assistants. The intent is what Home Assistant thinks you want it to do when it extracts a command from your voice or text utterance. Currently, the following intents are supported out of the box: HassTurnOn, HassTurnOff, HassGetState, and HassLightSet. - These intents allow you to turn things on or off, inquire about a state, or change the brightness or color of a light. + Intent is a term used with voice assistants. The intent is what Home + Assistant thinks you want it to do when it extracts a command from your + voice or text utterance. Currently, the following intents are supported out + of the box: HassTurnOn, HassTurnOff, HassGetState, and HassLightSet. These + intents allow you to turn things on or off, inquire about a state, or change + the brightness or color of a light. excerpt: > - Intent is a term used with voice assistants. The intent is what Home Assistant thinks you want it to do when it extracts a command from your voice or text utterance. + Intent is a term used with voice assistants. The intent is what Home + Assistant thinks you want it to do when it extracts a command from your + voice or text utterance. link: https://developers.home-assistant.io/docs/intent_builtin aliases: - Intents +- term: Label + definition: >- + Labels in Home Assistant allow grouping elements irrespective of their + physical location or type. Labels can be assigned to areas, devices, + entities, automations, scenes, scripts, and helpers. Labels can be used in + automations and scripts as a target for actions and services. Labels can + also be used to filter data. For example, you can filter the list of devices + to show only devices with the label `heavy energy usage` or turn these + devices off when there is not a lot of solar energy available. + excerpt: >- + Labels in Home Assistant allow grouping elements irrespective of their + physical location or type. Labels can be assigned to areas, devices, + entities, automations, scenes, scripts, and helpers. Labels can be used in + automations and scripts as a target for actions and services. Labels can + also be used to filter data. + aliases: + - labels - term: Lovelace definition: >- - Lovelace is the original code name of the UI that is now known as - [Home Assistant dashboards](/dashboards). + Lovelace is the original code name of the UI that is now known as [Home + Assistant dashboards](/dashboards). - term: Light definition: >- A light has a brightness you can control, and optionally color temperature @@ -251,9 +393,17 @@ link: /integrations/light - term: Matter definition: >- - Matter is an open-source standard that defines how to control smart home devices on a Wi-Fi or Thread network. The aim of the standard is to improve security and to make devices interoperable across vendors, replacing proprietary protocols for smart home ecosystems. Unlike other standards, Matter allows joining the same device to multiple controllers. For example, you can add a light to Google Home, Apple Home, and Home Assistant at the same time. A bridge device can be used to connect devices running on other smart home technologies such as Zigbee or Z-Wave. + Matter is an open-source standard that defines how to control smart home + devices on a Wi-Fi or Thread network. The aim of the standard is to improve + security and to make devices interoperable across vendors, replacing + proprietary protocols for smart home ecosystems. Unlike other standards, + Matter allows joining the same device to multiple controllers. For example, + you can add a light to Google Home, Apple Home, and Home Assistant at the + same time. A bridge device can be used to connect devices running on other + smart home technologies such as Zigbee or Z-Wave. excerpt: > - Matter is an open-source standard that defines how to control smart home devices on a Wi-Fi or Thread network. + Matter is an open-source standard that defines how to control smart home + devices on a Wi-Fi or Thread network. link: /integrations/matter - term: Notification definition: >- @@ -272,8 +422,8 @@ Platforms are building blocks provided by some integrations to be used by other integrations. For example, the [Light](/integrations/light) integration provides the `light platform` that is utilized by all - integrations providing `light` entities such - as e.g. [Hue](/integrations/hue). + integrations providing `light` entities such as e.g. + [Hue](/integrations/hue). excerpt: > Platforms are building blocks provided by some integrations to be used by other integrations. @@ -283,78 +433,97 @@ - term: Reload definition: >- Applies the changes made to the Home Assistant configuration files. Changes - are normally automatically updated. However, changes made outside of the front - end will not be reflected in Home Assistant and require a reload. - To perform a manual reload, go to **Settings** > **System** > - **Restart Home Assistant** (top right) > **Quick reload**. More granular - reload options are available in *YAML configuration reloading* section - in **Developer tools** > **YAML**. + are normally automatically updated. However, changes made outside of the + front end will not be reflected in Home Assistant and require a reload. To + perform a manual reload, go to **Settings** > **System** > **Restart Home + Assistant** (top right) > **Quick reload**. If you do not see the **Quick + reload** option in the menu, you need to enable **Advanced mode** in your + user settings. More granular reload options are available in *YAML + configuration reloading* section in **Developer tools** > **YAML**. excerpt: > - Applies the changes made to Home Assistant configuration files. Changes are normally - automatically updated. However, changes made outside of the front + Applies the changes made to Home Assistant configuration files. Changes are + normally automatically updated. However, changes made outside of the front end will not be reflected in Home Assistant and require a reload. - term: Scene definition: >- - Scenes capture the states you want certain entities to be. For example, - a scene can specify that light A should be turned on and light B should - be bright red. + Scenes capture the states you want certain entities to be. For example, a + scene can specify that light A should be turned on and light B should be + bright red. link: /integrations/scene/ aliases: - scenes - term: Script definition: > - Scripts are components that allow users to specify a sequence of actions - to be executed by Home Assistant when turned on. + Scripts are components that allow users to specify a sequence of actions to + be executed by Home Assistant when turned on. link: /docs/scripts/ aliases: - scripts - term: Sensor definition: >- - Sensors return information about a thing, for instance the level of water - in a tank. + Sensors return information about a thing, for instance the level of water in + a tank. link: /integrations/sensor/ aliases: - sensors - term: Selector definition: >- - Selectors are components for the user interface. Some selectors can, - for example, show a toggle button to turn something on or off, while another + Selectors are components for the user interface. Some selectors can, for + example, show a toggle button to turn something on or off, while another select can filter a list of devices to show only devices that have motion-sensing capabilities. excerpt: > - Selectors are components for the user interface. Like toggle, dropdown, - and more. + Selectors are components for the user interface. Like toggle, dropdown, and + more. link: /docs/blueprint/selectors/ aliases: - selectors - term: Service definition: |- - The term service has 2 meanings in Home Assistant: - **The information service** - For example, the municipal waste management service that provides entities for organic, paper, and packaging waste. In terms of functionality, the information service is like a device. It is called *service* to avoid confusion, as it does not come with a piece of hardware. - **The software function that interacts with targets to make something happen** - A service carries out one specific task, for example: turning on the light in the living room or sending a notification to a mobile phone. - A service has targets and data. Service targets are: areas, devices, and entities. Service data carries the information required to define the desired state change in the target. For example, the target, together with brightness 150 and RGB color `[255,0,0]`, or the message “Your coffee is ready”. - Services can be used in, for example, automation, scripts, dashboards, or voice commands to control your home. - Home Assistant provides a series of predefined services, such as `homeassistant.turn_on`, `homeassistant.toggle`, or `homeassistant.reload`. + The term service has 2 meanings in Home Assistant: **The information + service** For example, the municipal waste management service that provides + entities for organic, paper, and packaging waste. In terms of functionality, + the information service is like a device. It is called *service* to avoid + confusion, as it does not come with a piece of hardware. **The software + function that interacts with targets to make something happen** A service + carries out one specific task, for example: turning on the light in the + living room or sending a notification to a mobile phone. A service has + targets and data. Service targets are: areas, devices, and entities. Service + data carries the information required to define the desired state change in + the target. For example, the target, together with brightness 150 and RGB + color `[255,0,0]`, or the message “Your coffee is ready”. Services can be + used in, for example, automation, scripts, dashboards, or voice commands to + control your home. Home Assistant provides a series of predefined services, + such as `homeassistant.turn_on`, `homeassistant.toggle`, or + `homeassistant.reload`. excerpt: > - A service carries out one specific task, for example: turn on the light in the - living room. A service has targets and data and can be called by actions, a - dashboard, or via voice command. + A service carries out one specific task, for example: turn on the light in + the living room. A service has targets and data and can be called by + actions, a dashboard, or via voice command. link: /docs/scripts/service-calls/ aliases: - services - term: State definition: |- - The 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 data type of state is `string` (a textual value). Entities store 2 timestamps related to the state: `last_updated` and `last_changed`. Each entity has exactly one state and the state only holds one value at a time. However, entities can store attributes related to that state. For example, the state of a light is _on_, and the related state attributes could be its current brightness and color values. - State changes can be used as the source of triggers. The current state can be used in conditions. - + The 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 data type of state is `string` (a textual value). Entities store 2 + timestamps related to the state: `last_updated` and `last_changed`. Each + entity has exactly one state and the state only holds one value at a time. + However, entities can store attributes related to that state. For example, + the state of a light is _on_, and the related state attributes could be its + current brightness and color values. State changes can be used as the source + of triggers. The current state can be used in conditions. + link: /docs/configuration/state_object/ aliases: - states excerpt: > - The state holds the information of interest of an entity, for example, if a light is on or off. Each entity has exactly one state and the state only holds one value at a time. However, entities can store attributes related to that state such as brightness, color, or a unit of measurement. + The state holds the information of interest of an entity, for example, if a + light is on or off. Each entity has exactly one state and the state only + holds one value at a time. However, entities can store attributes related to + that state such as brightness, color, or a unit of measurement. - term: Switch definition: >- Switches are things that have two states you can select between, such as @@ -371,14 +540,37 @@ - term: Thread definition: >- - Thread is a low-power mesh networking standard that is specifically designed for smart home applications. It is a protocol that defines how devices communicate. *Mesh* topology means that the devices can communicate with each other directly, without going through a central controller first. Thread uses the same radio frequency (RF) technology as Zigbee, but provides IP connectivity similar to Wi-Fi. Unlike Zigbee, Thread does not specify how to control devices. How Thread-enabled devices are controlled is specified in a higher level protocol such as HomeKit or Matter. + Thread is a low-power mesh networking standard that is specifically designed + for smart home applications. It is a protocol that defines how devices + communicate. *Mesh* topology means that the devices can communicate with + each other directly, without going through a central controller first. + Thread uses the same radio frequency (RF) technology as Zigbee, but provides + IP connectivity similar to Wi-Fi. Unlike Zigbee, Thread does not specify how + to control devices. How Thread-enabled devices are controlled is specified + in a higher level protocol such as HomeKit or Matter. link: /integrations/thread/ excerpt: > - Thread is a low-power mesh networking standard that is specifically designed for smart home applications. It is a protocol that defines how devices communicate. + Thread is a low-power mesh networking standard that is specifically designed + for smart home applications. It is a protocol that defines how devices + communicate. +- term: Thread border router + definition: >- + A Thread border router forwards data packets between your local network and + the Thread network. This enables smart home devices within a Thread network + to communicate with IPv6-capable devices in your local network. A Thread + border router is connected to your network either via Wi-Fi or Ethernet and + uses its radio frequency (RF) radio to communicate with the Thread mesh + network. In case of Matter, the data that is forwarded is encrypted. + Examples of Thread border routers are the Nest Hub (2nd gen), the HomePod + mini, and the Home Assistant SkyConnect together with the OpenThread Border + Router add-on. + link: /integrations/thread/#about-thread-border-routers + aliases: + - Thread border routers - term: Trigger definition: >- - A trigger is a set of values or conditions of a platform that are defined - to cause an automation to run. + A trigger is a set of values or conditions of a platform that are defined to + cause an automation to run. link: /docs/automation/trigger/ aliases: - triggers @@ -388,21 +580,21 @@ TTS (text-to-speech) allows Home Assistant to talk to you. link: /integrations/tts/ - - term: Valve definition: >- - Valves are devices to control the flow of liquids and gases. All valves in Home Assistant can be opened - and closed. Some valves can also be set to a specific position. + Valves are devices to control the flow of liquids and gases. All valves in + Home Assistant can be opened and closed. Some valves can also be set to a + specific position. link: /integrations/valve - term: Variables definition: >- - Variables are used to store values in memory that can be processed - for example, in a script. + Variables are used to store values in memory that can be processed for + example, in a script. link: /docs/scripts/#variables - term: Zone definition: >- Zones are areas that can be used for presence detection. link: /integrations/zone/ aliases: - - zones \ No newline at end of file + - zones diff --git a/source/_docs/authentication.markdown b/source/_docs/authentication.markdown index 29b8a313b44..de84130966b 100644 --- a/source/_docs/authentication.markdown +++ b/source/_docs/authentication.markdown @@ -23,12 +23,12 @@ For the moment, other user accounts will have the same access as the owner accou
-If you want to manage users and you're an owner but you do not see "Users" in your main configuration menu, make sure that "Advanced Mode" is enabled for your user in your profile. +If you want to manage users and you're an owner but you do not see "Users" in your main configuration menu, make sure that **Advanced Mode** is enabled for your user in your profile.
### Your account profile -Once you're logged in, you can see the details of your account at the _Profile_ page by clicking on the circular at the very bottom of the sidebar. +Once you're logged in, you can see the details of your account on the {% my profile title="**User profile**" %} page by selecting on the circular at the very bottom of the sidebar. Screenshot of the profile page @@ -38,8 +38,15 @@ You can: - Enable or disable [multi-factor authentication](/docs/authentication/multi-factor-auth/). - Delete _Refresh Tokens_. These are created when you log in from a device. Delete them if you want to force the device to log out. - Create [Long Lived Access Tokens](https://developers.home-assistant.io/docs/auth_api/#long-lived-access-token) so scripts can securely interact with Home Assistant. +- Define language and other locale settings. - Log out of Home Assistant. +
+ +Unused refresh tokens will be automatically removed. A refresh token is considered unused if it has not been used for a login within 90 days. If you need a permanent token, then we recommend using [Long Lived Access Tokens](https://developers.home-assistant.io/docs/auth_api/#long-lived-access-token). + +
+ ### Securing your login _Make sure to choose a secure password!_ At some time in the future, you will probably want to access Home Assistant from outside your local network. This means you are also exposed to random black-hats trying to do the same. Treat the password like the key to your house. @@ -100,7 +107,3 @@ This will allow you to open Home Assistant at `http://homeassistant.home:8123/` ### Stuck on loading data Some ad blocking software, such as Wipr, also blocks WebSockets. If you're stuck on the Loading data screen, try disabling your ad blocker. - -### Migrating from pre 0.77 - -If you were using the authentication system before 0.77, you'd likely have `auth:` and `auth_providers:` defined. You'll need to remove these and let Home Assistant [handle it automatically](/docs/authentication/providers/#configuring-auth-providers). diff --git a/source/_docs/authentication/multi-factor-auth.markdown b/source/_docs/authentication/multi-factor-auth.markdown index 78cedd3abf7..5aa16847ce9 100644 --- a/source/_docs/authentication/multi-factor-auth.markdown +++ b/source/_docs/authentication/multi-factor-auth.markdown @@ -24,7 +24,7 @@ Home Assistant generates a secret key which is synchronized with an app on your #### Setting up TOTP -Enable TOTP in your `configuration.yaml` like this: +Enable TOTP in your {% term "`configuration.yaml`" %} like this: ```yaml homeassistant: @@ -64,7 +64,7 @@ The Notify MFA module uses the [notify integration](/integrations/notify/) to se #### Setting up MFA notify -Add Notify MFA to your `configuration.yaml` file like this: +Add Notify MFA to your {% term "`configuration.yaml`" %} file like this: ```yaml homeassistant: diff --git a/source/_docs/authentication/providers.markdown b/source/_docs/authentication/providers.markdown index f566a41d5b7..8f42cdc1224 100644 --- a/source/_docs/authentication/providers.markdown +++ b/source/_docs/authentication/providers.markdown @@ -1,6 +1,9 @@ --- title: "Authentication providers" description: "Guide on configuring different authentication providers." +related: + - docs: /docs/configuration/ + title: configuration.yaml file ---
@@ -13,13 +16,13 @@ When you log in, an _auth provider_ checks your credentials to make sure you are
-Home Assistant automatically configures the standard auth providers so you don't need to specify `auth_providers` in your `configuration.yaml` file unless you are configuring more than one. Specifying `auth_providers` will disable all auth providers that are not listed, so you could reduce your security or create difficulties logging in if it is not configured correctly. +Home Assistant automatically configures the standard auth providers so you don't need to specify `auth_providers` in your {% term "`configuration.yaml`" %} file unless you are configuring more than one. Specifying `auth_providers` will disable all auth providers that are not listed, so you could reduce your security or create difficulties logging in if it is not configured correctly. If you decide to use `trusted_networks` as your `auth_provider` there won't be a way to authenticate for a device outside of your listed trusted network. To overcome this ensure you add the default `auth_provider` with `type: homeassistant` back in manually. This will then present you with the default auth login screen when trusted network authentication fails as expected from outside your LAN.
-Authentication providers are configured in your `configuration.yaml` under the `homeassistant:` block. +Authentication providers are configured in your {% term "`configuration.yaml`" %} file under the `homeassistant:` block. If you are moving configuration to packages, this particular configuration must stay within 'configuration.yaml'. See Issue 16441 in the warning block at the bottom of this page. @@ -44,7 +47,7 @@ User details are stored in the `[your config]/.storage` directory. All password Users can be managed in Home Assistant by the owner. Go to the configuration panel and click on _{% my users %}_. -This is the entry in `configuration.yaml` for Home Assistant auth: +This is the entry in {% term "`configuration.yaml`" %} for Home Assistant auth: ```yaml homeassistant: @@ -52,7 +55,7 @@ homeassistant: - type: homeassistant ``` -If you don't specify any `auth_providers` section in the `configuration.yaml` file then this provider will be set up automatically. +If you don't specify any `auth_providers` section in the {% term "`configuration.yaml`" %} file then this provider will be set up automatically. ### Trusted networks @@ -72,7 +75,7 @@ You cannot trust a network that you are using in any [trusted_proxies](/integrat
-Here is an example in `configuration.yaml` to set up Trusted Networks: +Here is an example in {% term "`configuration.yaml`" %} to set up Trusted Networks: ```yaml homeassistant: diff --git a/source/_docs/automation/editor.markdown b/source/_docs/automation/editor.markdown index ec7fc6a8da9..ef2fc518130 100644 --- a/source/_docs/automation/editor.markdown +++ b/source/_docs/automation/editor.markdown @@ -39,9 +39,11 @@ Automations created or edited via the user interface are activated immediately a ## Troubleshooting missing automations + When you're creating automations using the GUI and they don't appear in the UI, make sure that you add back `automation: !include automations.yaml` from the default configuration to your `configuration.yaml`. ## Related topics - [Automating Home Assistant](/getting-started/automation/) - [Persistent notifications](/integrations/persistent_notification/) + diff --git a/source/_docs/automation/trigger.markdown b/source/_docs/automation/trigger.markdown index d787c2fcc33..9625c7eaa55 100644 --- a/source/_docs/automation/trigger.markdown +++ b/source/_docs/automation/trigger.markdown @@ -1,6 +1,9 @@ --- title: "Automation Trigger" description: "All the different ways how automations can be triggered." +related: + - docs: /voice_control/custom_sentences/#adding-a-custom-sentence-to-trigger-an-automation + title: Adding a custom sentence to trigger an automation --- Triggers are what starts the processing of an {% term automation %} rule. When _any_ of the automation's triggers becomes true (trigger _fires_), Home Assistant will validate the [conditions](/docs/automation/condition/), if any, and call the [action](/docs/automation/action/). @@ -212,7 +215,7 @@ automation: ## Numeric state trigger -Fires when the numeric value of an entity's state (or attribute's value if using the `attribute` property, or the calculated value if using the `value_template` property) **crosses** a given threshold. On state change of a specified entity, attempts to parse the state as a number and fires if the value is changing from above to below or from below to above the given threshold. +Fires when the numeric value of an entity's state (or attribute's value if using the `attribute` property, or the calculated value if using the `value_template` property) **crosses** a given threshold (equal excluded). On state change of a specified entity, attempts to parse the state as a number and fires if the value is changing from above to below or from below to above the given threshold (equal excluded).
Crossing the threshold means that the trigger only fires if the state wasn't previously within the threshold. @@ -257,7 +260,24 @@ automation: {% endraw %} -More dynamic and complex calculations can be done with `value_template`. +More dynamic and complex calculations can be done with `value_template`. The variable 'state' is the [state object](/docs/configuration/state_object) of the entity specified by `entity_id`. + +The state of the entity can be referenced like this: + +{% raw %} + +```yaml +automation: + trigger: + - platform: numeric_state + entity_id: sensor.temperature + value_template: "{{ state.state | float * 9 / 5 + 32 }}" + above: 70 +``` + +{% endraw %} + +Attributes of the entity can be referenced like this: {% raw %} @@ -277,8 +297,8 @@ Listing above and below together means the numeric_state has to be between the t 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.
-Number helpers (`input_number` entities), `number` and `sensor` entities that -contain a numeric value, can be used in the `above` and `below` thresholds, +Number helpers (`input_number` entities), `number`, `sensor`, and `zone` entities +that contain a numeric value, can be used in the `above` and `below` thresholds, making the trigger more dynamic, like: ```yaml @@ -946,6 +966,10 @@ The sentences matched by this trigger will be: Punctuation and casing are ignored, so "It's PARTY TIME!!!" will also match. +### Related topic + +- [Adding a custom sentence to trigger an automation](/voice_control/custom_sentences/#adding-a-custom-sentence-to-trigger-an-automation) + ### Sentence wildcards Adding one or more `{lists}` to your trigger sentences will capture any text at that point in the sentence. A `slots` object will be [available in the trigger data](/docs/automation/templating#sentence). @@ -1011,3 +1035,35 @@ automation: - platform: time at: "15:32:00" ``` + +Triggers can also be disabled based on limited templates or blueprint inputs. These are only evaluated once when the automation is loaded. + +{% raw %} + +```yaml +blueprint: + input: + input_boolean: + name: Boolean + selector: + boolean: + input_number: + name: Number + selector: + number: + min: 0 + max: 100 + + trigger_variables: + _enable_number: !input input_number + + trigger: + - platform: sun + event_type: sunrise + enabled: !input input_boolean + - platform: sun + event_type: sunset + enabled: "{{ _enable_number < 50 }}" +``` + +{% endraw %} diff --git a/source/_docs/automation/troubleshooting.markdown b/source/_docs/automation/troubleshooting.markdown index a41825249f6..458a88dc5b2 100644 --- a/source/_docs/automation/troubleshooting.markdown +++ b/source/_docs/automation/troubleshooting.markdown @@ -3,43 +3,72 @@ title: "Troubleshooting automations" description: "Tips on how to troubleshoot your automations." --- +Automations and {% term scripts %} can be debugged in a few different ways. You can [test run](#testing-your-automation) the full sequence of actions, or test each condition and action separately. [Traces](#traces) let you see details of every step after an automation is run. For complicated automations with {% term templates %}, see the section [testing templates](#testing-templates). + +## Testing your automation + +Many automations can be tested directly in the automation editor UI. + +### Running the entire automation + +In the three dots menu in the automation list or automation editor UI, select the **Run** button. This will execute all of the {% term actions %}, while skipping all {% term triggers %} and {% term conditions %}. This lets you test the full sequence of actions, as if the automation was triggered and all conditions were true. Note that any [trigger ID](/docs/automation/trigger/#trigger-id) used in your triggers will not be active when you test this way. The Trigger ID or any data passed by in the `trigger` data in conditions or actions can't be tested directly this way. + +You can also trigger an automation manually. This can test the conditions as if the automation was triggered by an event. Navigate to {% my developer_services title="**Developer tools** > **Services**" %}. In the service selection drop-down, select **Automation: Trigger**, then **Choose entity** to select the automation you are testing. Toggle whether to skip the conditions, then **Call service**. If needed, additional `trigger` or other data can be added in the YAML view for testing. The [trigger](/docs/automation/trigger/) page has more information about data within the trigger. + +Testing with complex triggers, conditions, and variables can be difficult. Note that using the **Run** button will skip all triggers and conditions, while **Developer Tools** can be used with or without checking conditions. + +### Running individual actions or conditions + +In the automation editor UI, each {% term condition %} and {% term action %} can be tested individually. Select the three dots menu, then the **Test** button. + +- Testing a condition will highlight it to show whether the condition passed at the moment it was tested. If all conditions pass, then the automation will run when triggered. Testing building blocks like an **and** condition will report whether the whole block registers as true or false, or you can test individual conditions within the building block. + +- Testing an action block will run that block immediately. + +Note that complex automations that depend on previous blocks, such as trigger IDs, variables in templates, or service calls that return data to use in subsequent blocks, cannot be tested this way. + +If you are writing automations in YAML, it is also useful to go to {% my server_controls title="**Developer tools** > **YAML**" %}** and in the Configuration validation section, select the **Check configuration** button. This is to make sure there are no syntax errors before restarting Home Assistant. In order for **Check configuration** to be visible, you must enable **Advanced Mode** on {% my profile title="your user profile" %}. + +## Traces + When an {% term automation %} is run, all steps are recorded and a trace is made. From the UI, open **Settings**, which is located in the sidebar, then select **Automations & Scenes** to go to the automation editor or click this button directly: {% my automations badge %} -Click on the clock icon next to an automation to enter the debugging screen. Alternatively, click on **Show trace** directly from a Logbook automation entry. +From the automation editor UI, or in the automations list in the three dots menu, select **Traces**. Alternatively, select an automation entry shown in the Logbook. ![Automation tracing example](/images/integrations/automation/automation-tracing.png) The above screenshot shows a previous run of an automation. The automation is displayed using an interactive graph, highlighting which path the automation took. Each node in the graph can be clicked to view the details on what happened with the automation during that specific step. It traces the complete run of an automation. -The debugging screen is split into four features, the first being the Step Details which provides all details for each step of the automation. The second feature is the Trace Timeline which the screenshot above shows and where the automation can be followed on a timeline. The next is Related logbook entries, as the name says a logbook for all the entries related to the specific trace. The last two features are Automation Config and optionally Blueprint Config for the automation YAML code. +The right side of the trace screen has tabs with more information: + +- **Step Details** shows data and results of the step that is currently highlighted. +- **Automation Config** shows the full YAML configuration at the time the automation was run. +- **Trace Timeline**, shown in the screenshot above, lists the steps that were executed and their timing. +- **Related logbook entries**, shows a logbook for all the entries related to the specific trace. +- **Blueprint Config** will only be shown if the automation was created from a {% term blueprint %}. + +The top bar shows the date and time the automation was triggered. Use the left and right arrows to view previous runs of the automation. Automations created in YAML must have an [`id`](/docs/automation/yaml/#migrating-your-yaml-automations-to-automationsyaml) assigned in order for debugging traces to be stored. -#### Traces +### Trace configuration The last 5 traces are recorded for all automations. It is possible to change this by adding the following code to your automation. +{% raw %} + ```yaml trace: - stored_traces: 1 + stored_traces: 20 ``` -[template]: /docs/configuration/templating/ +{% endraw %} -## Testing your automation +## Testing templates -It is generally a difficult task to test an automation, especially if it includes several triggers and some conditions. +If your automation uses [templates](/docs/configuration/templating/) in any part, you can do the following to make sure it works as expected: -Please note that if you click on **Trigger** of an automation in the frontend, **only the `action` part will be executed** by Home Assistant. That means you **can't** test your trigger or condition part that way. It also means that if your automation uses some data from triggers, it won't work properly as well just because `trigger` is not defined in this scenario. - -All this makes that Trigger feature pretty limited and nearly useless for debugging purposes so you need to find another way. -Make sure you check and adapt to your circumstances appropriate examples from Automation Trigger, Conditions and Actions. - -It is also useful to go to **{% my server_controls title="Developer Tools -> YAML" %}** and click on **Check Configuration** button in Configuration validation section to make sure there are no syntax errors before restarting Home Assistant. In order for **Check configuration** to be visible, you must enable **Advanced Mode** on {% my profile title="your user profile" %}. - -If your automation uses templates in any part, you can do the following to make sure it works as expected: - -1. Go to **{% my developer_template title="Developer tools -> Template" %}** tab. +1. Go to {% my developer_template title="**Developer tools** > **Template**" %} tab. 2. Create all variables (sources) required for your template as described at the end of [this](https://www.home-assistant.io/docs/configuration/templating/#processing-incoming-data) paragraph. 3. Copy your template code and paste it in Template editor straight after your variables. 4. If necessary, change your sources' value and check if the template works as you want and does not generate any errors. diff --git a/source/_docs/automation/using_blueprints.markdown b/source/_docs/automation/using_blueprints.markdown index 061538244dd..70f6af83cc3 100644 --- a/source/_docs/automation/using_blueprints.markdown +++ b/source/_docs/automation/using_blueprints.markdown @@ -91,4 +91,4 @@ Learn more about blueprints by [reading our tutorial on creating a blueprint](/d ## Troubleshooting missing automations -When you're creating automations using blueprints and they don't appear in the UI, make sure that you add back `automation: !include automations.yaml` from the default configuration to your `configuration.yaml`. +When you're creating automations using blueprints and they don't appear in the UI, make sure that you add back `automation: !include automations.yaml` from the default configuration to your {% term "`configuration.yaml`" %}. diff --git a/source/_docs/automation/yaml.markdown b/source/_docs/automation/yaml.markdown index 2484b3b20e5..48c6233ead7 100644 --- a/source/_docs/automation/yaml.markdown +++ b/source/_docs/automation/yaml.markdown @@ -7,7 +7,7 @@ Automations are created in Home Assistant via the UI, but are stored in a YAML f 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 `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 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 @@ -128,7 +128,7 @@ Mode | Description ## YAML example -Example of a YAML based automation that you can add to `configuration.yaml`. +Example of a YAML based automation that you can add to {% term "`configuration.yaml`" %}. {% raw %} diff --git a/source/_docs/backend/database.markdown b/source/_docs/backend/database.markdown index 5e53c82ea3d..f16cf2a2553 100644 --- a/source/_docs/backend/database.markdown +++ b/source/_docs/backend/database.markdown @@ -3,7 +3,7 @@ title: "Database" description: "Details about the database used by Home Assistant." --- -Home Assistant uses databases to store {% term events %} and parameters for history and tracking. The default database used is [SQLite](https://www.sqlite.org/) and the database file is stored in your [configuration directory](/getting-started/configuration/) (e.g., `/home-assistant_v2.db`); however, other databases can be used. If you prefer to run a database server (e.g., PostgreSQL), use the [`recorder` integration](/integrations/recorder/). +Home Assistant uses databases to store {% term events %} and parameters for history and tracking. The default database used is [SQLite](https://www.sqlite.org/) and the database file is stored in your [configuration directory](/getting-started/configuration/) (e.g., `/home-assistant_v2.db`); however, other databases can be used. If you prefer to run a database server (e.g., PostgreSQL), use the [`recorder`](/integrations/recorder/) integration. To work with SQLite database manually from the command-line, you will need an [installation](https://www.sqlitetutorial.net/download-install-sqlite/) of `sqlite3`. Alternatively [DB Browser for SQLite](https://sqlitebrowser.org/) provides a viewer for exploring the database data and an editor for executing SQL commands. First load your database with `sqlite3`: diff --git a/source/_docs/blueprint.markdown b/source/_docs/blueprint.markdown index c0e17ab7126..eb07e05191c 100644 --- a/source/_docs/blueprint.markdown +++ b/source/_docs/blueprint.markdown @@ -1,6 +1,17 @@ --- title: "About blueprints" description: "Introduction to blueprints." +related: + - docs: /docs/blueprint/schema/ + title: About the blueprint schema + - docs: /docs/blueprint/selectors/ + title: About the blueprint selectors + - docs: /docs/automation/using_blueprints/ + title: Using blueprints in automations + - docs: /docs/blueprint/tutorial/ + title: "Tutorial: Create an automation blueprint" + - title: "Blueprint community forum" + url: /get-blueprints --- This section gives a high-level introduction to blueprints. To view a description of the YAML-schema used to create a valid blueprint, refer to the section [About the blueprint schema](/docs/blueprint/schema/). @@ -13,12 +24,4 @@ Imagine you want to control lights based on motion. A blueprint provides the gen Blueprints are shared by the community in the [blueprint community forum][blueprint-forums]. -### Related information - -- [About the blueprint schema](/docs/blueprint/schema/) -- [About the blueprint selectors](/docs/blueprint/selectors/) -- [Using blueprints in automations](/docs/automation/using_blueprints/) -- [Tutorial: Create an automation blueprint](/docs/blueprint/tutorial/) -- [Blueprint community forum][blueprint-forums] - -[blueprint-forums]: /get-blueprints \ No newline at end of file +[blueprint-forums]: /get-blueprints diff --git a/source/_docs/blueprint/schema.markdown b/source/_docs/blueprint/schema.markdown index 3ff7baf3e27..42c35e1a0a7 100644 --- a/source/_docs/blueprint/schema.markdown +++ b/source/_docs/blueprint/schema.markdown @@ -1,6 +1,17 @@ --- title: "About the blueprint schema" description: "Introduction to the blueprint schema." +related: + - docs: /docs/blueprint/ + title: About blueprints + - docs: /docs/blueprint/selectors/ + title: Blueprint selectors + - docs: /docs/automation/using_blueprints/ + title: Using blueprints in automations + - docs: /docs/blueprint/tutorial/ + title: "Tutorial: Create an automation blueprint" + - title: "Blueprint community forum" + url: /get-blueprints --- ## The blueprint schema @@ -68,34 +79,12 @@ homeassistant: required: false input: description: > - A dictionary of defined user inputs. These are the input fields that the + A dictionary of defined user inputs or sections. These are the input fields that the consumer of your blueprint can provide using YAML definition, or via - a configuration form in the UI. + a configuration form in the UI. Sections provide a way to visually group a set of + related inputs (see below). type: map required: false - keys: - name: - description: The name of the input field. - type: string - required: false - description: - description: > - A short description of the input field. Keep this short and descriptive. - The description can include [Markdown](https://commonmark.org/help/). - type: string - required: false - selector: - description: > - The [selector](/docs/blueprint/selectors/) to use for this input. A - selector defines how the input is displayed in the frontend UI. - type: selector - required: false - default: - description: > - The default value of this input, in case the input is not provided - by the user of this blueprint. - type: any - required: false {% endconfiguration %} ### Blueprint inputs @@ -107,6 +96,34 @@ These inputs can be of any type (string, boolean, list, dictionary). They can ha a default value and also provide a [selector](/docs/blueprint/selectors/) that ensures a matching input field in the user interface. +A blueprint input has the following configuration: + +{% configuration %} + name: + description: The name of the input field. + type: string + required: false + description: + description: > + A short description of the input field. Keep this short and descriptive. + The description can include [Markdown](https://commonmark.org/help/). + type: string + required: false + selector: + description: > + The [selector](/docs/blueprint/selectors/) to use for this input. A + selector defines how the input is displayed in the frontend UI. + type: selector + required: false + default: + description: > + The default value of this input, in case the input is not provided + by the user of this blueprint. + type: any + required: false + +{% endconfiguration %} + Each input field can be referred to, outside of the blueprint metadata, using the `!input` custom YAML tag. @@ -129,6 +146,70 @@ It is then up to the user to find out what to enter there. Blueprints that come A blueprint can have as many inputs as you like. +### Blueprint input sections + +One or more input sections can be added under the main `input` key. Each section visually groups the inputs in that section, +allows an optional description, and optionally allows for collapsing those inputs. + +A section is differentiated from an input by the presence of an additional `input` key within that section. + +
+Input sections are a new feature in version 2024.6. Set the `min_version` for the blueprint to at least this version if using input sections. Otherwise, the blueprint will generate errors on older versions. +
+ +The full configuration for a section is below: + +{% configuration %} + +name: + description: A name for the section. If omitted the key of the section is used. + type: string + required: false +icon: + description: An icon to display next to the name of the section. + type: string + required: false +description: + description: > + An optional description of this section, which will be displayed at the top of the section. + The description can include [Markdown](https://commonmark.org/help/). + type: string + required: false +collapsed: + description: If `true`, the section will be collapsed by default. Useful for optional or less important inputs. All collapsed inputs must also have a defined `default` before they can be hidden. + type: boolean + default: false + required: false +input: + description: > + A dictionary of defined user inputs within this section. + type: map + required: true + +{% endconfiguration %} + + + +The following example shows a blueprint with some inputs in a section: + +```yaml +blueprint: + name: Example sections blueprint + description: Example showing a section + input: + base_input: + name: An input not in the section + my_section: + name: My Section + icon: mdi:cog + description: These options control a specific feature of this blueprint + input: + my_input: + name: Example input + my_input_2: + name: 2nd example input +``` + ### Blueprint inputs in templates The inputs are available as custom YAML tags, but not as template variables. @@ -202,12 +283,4 @@ action: target: !input light_target ``` -### Related information -- [About blueprints](/docs/blueprint/) -- [Blueprint selectors](/docs/blueprint/selectors/) -- [Using blueprints in automations](/docs/automation/using_blueprints/) -- [Tutorial: Create an automation blueprint »](/docs/blueprint/tutorial/) -- [Blueprint community forum][blueprint-forums] - [blueprint-built-in]: https://github.com/home-assistant/core/tree/dev/homeassistant/components/automation/blueprints -[blueprint-forums]: /get-blueprints diff --git a/source/_docs/blueprint/selectors.markdown b/source/_docs/blueprint/selectors.markdown index cc70e88028b..fb7419dc58e 100644 --- a/source/_docs/blueprint/selectors.markdown +++ b/source/_docs/blueprint/selectors.markdown @@ -18,7 +18,6 @@ The following selectors are currently available: - [Action selector](#action-selector) - [Add-on selector](#add-on-selector) - [Area selector](#area-selector) - - [Example area selectors](#example-area-selectors) - [Attribute selector](#attribute-selector) - [Assist pipeline selector](#assist-pipeline-selector) - [Backup location selector](#backup-location-selector) @@ -32,22 +31,21 @@ The following selectors are currently available: - [Date selector](#date-selector) - [Date \& time selector](#date--time-selector) - [Device selector](#device-selector) - - [Example device selector](#example-device-selector) - [Duration selector](#duration-selector) - [Entity selector](#entity-selector) - - [Example entity selector](#example-entity-selector) +- [Floor selector](#floor-selector) - [Icon selector](#icon-selector) +- [Label selector](#label-selector) - [Language selector](#language-selector) - [Location selector](#location-selector) - [Media selector](#media-selector) - [Number selector](#number-selector) - - [Example number selectors](#example-number-selectors) - [Object selector](#object-selector) +- [QR code selector](#qr-code-selector) - [RGB color selector](#rgb-color-selector) - [Select selector](#select-selector) - [State selector](#state-selector) - [Target selector](#target-selector) - - [Example target selectors](#example-target-selectors) - [Template selector](#template-selector) - [Text selector](#text-selector) - [Theme selector](#theme-selector) @@ -210,7 +208,7 @@ living_room - kitchen ``` -### Example area selectors +### Example area selectors An example area selector only shows areas that provide one or more lights or switches provided by the [ZHA](/integrations/zha) integration. @@ -273,7 +271,7 @@ assist_pipeline: ## Backup location selector This can only be used on an installation with a Supervisor (Operating System or -Supervised). For installations of type Home Assistant Core or Container, an error +Supervised). For installations of type {% term "Home Assistant Core" %} or {% term "Home Assistant Container" %}, an error will be displayed. The backup location selector shows a list of places a backup could go, depending @@ -417,20 +415,6 @@ language: The output of this selector is the ID of the conversation agent. -## Date selector - -The date selector shows a date input that allows the user to specify a date. - -![Screenshot of the Date selector](/images/blueprints/selector-date.png) - -This selector does not have any other options; therefore, it only has its key. - -```yaml -date: -``` - -The output of this selector will contain the date in Year-Month-Day -(`YYYY-MM-DD`) format, for example, `2022-02-22`. ## Country selector @@ -458,6 +442,21 @@ no_sort: The output of this selector is an ISO 3166 country code. +## Date selector + +The date selector shows a date input that allows the user to specify a date. + +![Screenshot of the Date selector](/images/blueprints/selector-date.png) + +This selector does not have any other options; therefore, it only has its key. + +```yaml +date: +``` + +The output of this selector will contain the date in Year-Month-Day +(`YYYY-MM-DD`) format, for example, `2022-02-22`. + ## Date & time selector The date selector shows a date and time input that allows the user to specify a @@ -579,7 +578,7 @@ faadde5365842003e8ca55267fe9d1f4 - 3da77cb054352848b9544d40e19de562 ``` -### Example device selector +### Example device selector An example entity selector that, will only show devices that are: @@ -715,7 +714,7 @@ light.living_room - light.kitchen ``` -### Example entity selector +### Example entity selector An example entity selector that, will only show entities that are: @@ -735,6 +734,141 @@ entity: device_class: motion ``` +## Floor selector + +The floor selector shows a floor finder that can pick +floors based on the selector configuration. The value of the input will be the +floor ID. If `multiple` is set to `true`, the value is a list of floor IDs. + +A floor selector can filter the list of floors based on the properties of the +devices and entities assigned to the areas on those floors. +For example, the floor list could be limited to floors with entities +provided by the [ZHA](/integrations/zha) integration, based on the areas they are in. + +In its most basic form, this selector doesn't require any options. +It will show all floors. + +![Screenshot of a floor selector](/images/blueprints/selector-floor.png) + +```yaml +floor: +``` + +{% configuration floor %} +device: + description: > + When device options are provided, the list of floors is filtered by floors + that have at least one device matching the given conditions. Can be + either an object or a list of objects. + type: list + required: false + keys: + integration: + description: > + Can be set to an integration domain. Limits the list of floors that + have devices by this integration domain. For example, + [`zha`](/integrations/zha). + type: string + required: false + manufacturer: + description: > + When set, the list only includes floors that have devices by the set + manufacturer name. + type: string + required: false + model: + description: > + When set, the list only includes floors that have devices which have + the set model. + type: string + required: false +entity: + description: > + When entity options are provided, the list only includes floors + that at least have one entity that matches the given conditions. Can be + either an object or a list of objects. + type: list + required: false + keys: + integration: + description: > + Can be set to an integration domain. Limits the list of floors that + have entities by the set integration domain. For example, + [`zha`](/integrations/zha). + type: string + required: false + domain: + description: > + When set, the list only includes floors that have entities of certain domains, + for example, [`light`](/integrations/light) or + [`binary_sensor`](/integrations/binary_sensor). Can be either a string + with a single domain, or a list of string domains to limit the selection to. + type: [string, list] + required: false + device_class: + description: > + When set, the list only includes floors that have entities with a certain + device class, for example, `motion` or `window`. Can be either a string + with a single device_class, or a list of string device_class to limit + the selection. + type: [device_class, list] + required: false + supported_features: + description: > + When set, the list only includes floors that have entities with a certain + supported feature, for example, `light.LightEntityFeature.TRANSITION` + or `climate.ClimateEntityFeature.TARGET_TEMPERATURE`. Should be a list + of features. + type: list + required: false +multiple: + description: > + Allows selecting multiple floors. If set to `true`, the resulting value of + this selector will be a list instead of a single string value. + type: boolean + default: false + required: false +{% endconfiguration %} + +The output of this selector is the floor ID, or (in case `multiple` is set to +`true`) a list of floor IDs. + +```yaml +# Example floor selector output result, when multiple is set to false +first_floor + +# Example floor selector output result, when multiple is set to true +- first_floor +- second_floor +``` + +### Example floor selectors + +An example floor selector only shows floors that have one or more lights or +switches provided by the [ZHA](/integrations/zha) integration. + +```yaml +floor: + entity: + integration: zha + domain: + - light + - switch +``` + +Another example using the floor selector, which only shows floors that +have one or more remote controls provided by the [deCONZ](/integrations/deconz) +integration. Multiple floors can be selected. + +```yaml +floor: + multiple: true + device: + - integration: deconz + manufacturer: IKEA of Sweden + model: TRADFRI remote control +``` + ## Icon selector The icon selector shows an icon picker that allows the user to select an icon. @@ -753,6 +887,43 @@ placeholder: The output of this selector is a string containing the selected icon, for example: `mdi:bell`. +## Label selector + +The label selector shows a label finder that can pick labels. The value of the +input is the label ID. If `multiple` is set to `true`, the value is a list +of label IDs. + +![Screenshot of the label selector](/images/blueprints/selector-label.png) + +In its most basic form, this selector doesn't require any options. +It will show all labels. + +```yaml +label: +``` + +{% configuration text %} +multiple: + description: > + Allows selecting multiple labels. If set to `true`, the resulting value of + this selector will be a list instead of a single string value. + type: boolean + default: false + required: false +{% endconfiguration %} + +The output of this selector is the label ID, or (in case `multiple` is set to +`true`) a list of label IDs. + +```yaml +# Example label selector output result, when multiple is set to false +energy_saving + +# Example label selector output result, when multiple is set to true +- energy_saving +- christmas_decorations +``` + ## Language selector The language selector allows a user to pick a language from a list of languages. @@ -908,7 +1079,7 @@ mode: The output of this selector is a number, for example: `42` -### Example number selectors +### Example number selectors An example number selector that allows a user a percentage, directly in a regular number input box. @@ -948,6 +1119,39 @@ object: The output of this selector is a YAML object. +## QR code selector + +The QR code selector shows a QR code. It has no return value. + +![Screenshot of a QR code selector](/images/blueprints/selector-qr-code.png) + +The QR code's data must be configured, and optionally, the scale, and error correction level can be set. +The scale makes the QR code bigger or smaller. + +{% configuration qr_code %} +data: + description: The data that should be represented in the QR code. + type: any + required: true +scale: + description: The scale factor to use, this will make the QR code bigger or smaller. + type: integer + required: false + default: 4 +error_correction_level: + description: The error correction level of the QR code, with a higher error correction level the QR code can be scanned even when some pieces are missing. Can be "low", "medium", "quartile" or "high". + type: string + required: false + default: medium +{% endconfiguration %} + +```yaml +qr_code: + data: "https://home-assistant.io" + scale: 5 + error_correction_level: quartile +``` + ## RGB color selector The RGB color selector allows the user to select an color from a color picker @@ -1174,7 +1378,7 @@ action: -### Example target selectors +### Example target selectors An example target selector that only shows targets that at least provide one or more lights, provided by the [ZHA](/integrations/zha) integration. @@ -1324,4 +1528,4 @@ The output of this selector is a list of triggers. For example: - platform: numeric_state entity_id: "sensor.outside_temperature" below: 20 -``` +``` \ No newline at end of file diff --git a/source/_docs/blueprint/tutorial.markdown b/source/_docs/blueprint/tutorial.markdown index 5dd5c86ba58..6f988e5465c 100644 --- a/source/_docs/blueprint/tutorial.markdown +++ b/source/_docs/blueprint/tutorial.markdown @@ -1,6 +1,22 @@ --- title: "Creating an automation blueprint" description: "Tutorial on creating an automation blueprint." +related: + - docs: /docs/configuration/ + title: "Editing the configuration file" + - docs: /docs/configuration/yaml/ + - docs: /docs/automation/yaml/ + title: "YAML used in automations" + - docs: /docs/scripts/ + title: Scripts + - docs: /docs/blueprint/selectors/ + title: Blueprint selectors + - docs: /docs/blueprint/schema/ + title: Blueprint schema + - docs: /docs/blueprint/ + title: About blueprints + - docs: /docs/automation/using_blueprints/ + title: Using automation blueprints ---
@@ -121,7 +137,7 @@ For more information on blueprint inputs, refer to the documentation of the [blu With the bare minimum metadata added, your blueprint is ready to use. -Open your `configuration.yaml` and add the following: +Open your {% term "`configuration.yaml`" %} and add the following: ```yaml automation tutorial: @@ -186,8 +202,7 @@ blueprint: selector: target: entity: - filter: - - domain: light + - domain: light ``` By limiting our blueprint to working with lights and motion sensors, we unlock a couple of benefits: the UI will be able to limit suggested values to lights and motion sensors instead of all devices. It will also allow the user to pick an area to control the lights in. @@ -218,8 +233,7 @@ blueprint: selector: target: entity: - filter: - - domain: light + - domain: light trigger: - platform: state @@ -273,17 +287,3 @@ For this tutorial, we're going to share it on GitHub Gists. This is a good optio ### Share on the Blueprint Exchange If you follow the [Rules and format for posting](/get-blueprints), you can share your blueprint on the Home Assistant Blueprint Exchange forum. This option is accessible to the general Home Assistant community but recommended only for your original blueprints. Please don't post this tutorial to the Blueprint Exchange, but instead, remember this as an option for releasing your real blueprints. - -## Related topics - -**Prerequisites** -- [Editing the configuration file](/docs/configuration/) -- [YAML](/docs/configuration/yaml/), and specifically, [YAML used in automations](/docs/automation/yaml/) -- [Scripts](/docs/scripts/) - -**Blueprints** - -- [Blueprint selectors](/docs/blueprint/selectors/) -- [Blueprint schema](/docs/blueprint/schema/) -- [About blueprints](/docs/blueprint/) -- [Using automation blueprints](/docs/automation/using_blueprints/) diff --git a/source/_docs/configuration.markdown b/source/_docs/configuration.markdown index b02e1a6e379..080fb014545 100644 --- a/source/_docs/configuration.markdown +++ b/source/_docs/configuration.markdown @@ -1,45 +1,90 @@ --- title: "Configuration.yaml" description: "Configuring Home Assistant via text files." +related: + - docs: /docs/configuration/yaml/ + title: YAML syntax + - docs: /docs/configuration/secrets + title: Storing credentials in `secrets.yaml` file + - docs: /common-tasks/os/#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 + - docs: /docs/tools/dev-tools/#reloading-the-yaml-configuration + title: Reloading the YAML configuration from developer tools + - docs: /common-tasks/os/#configuring-access-to-files + title: Configuring file access on the Operating System + - docs: /common-tasks/supervised/#configuring-access-to-files + title: Configuring file access on Supervised + - docs: docs/configuration/troubleshooting/ + title: Troubleshooting the configuration --- -While you can configure most of Home Assistant directly from the user interface under {% my config %}, some parts need you to edit `configuration.yaml`. This file contains {% term integrations %} to be loaded along with their configurations. Throughout the documentation you will find snippets that you can add to your configuration file to enable specific functionality. +While you can configure most of Home Assistant from the user interface, for some integrations, you need to edit the `configuration.yaml` file. This file contains {% term integrations %} to be loaded along with their configurations. Throughout the documentation, you will find snippets that you can add to your configuration file to enable specific functionality. -If you run into trouble while configuring Home Assistant, refer to the [configuration troubleshooting page](/docs/configuration/troubleshooting/) and the [`configuration.yaml` examples](/examples/#example-configurationyaml). +

+Screenshot of an example of a configuration.yaml file, accessed using the File editor add-on on a Home Assistant Operating System installation. +Example of a configuration.yaml file, accessed using the File editor add-on on a Home Assistant Operating System installation. +

## Editing `configuration.yaml` -The easiest option to edit `configuration.yaml` is to use the {% my supervisor_addon title="Studio Code Server add-on" addon="a0d7b954_vscode" %}. This add-on runs VS Code, which offers live syntax checking and auto-fill of various Home Assistant entities. See [here](/common-tasks/supervised/#installing-and-using-the-visual-studio-code-vsc-add-on) for details. If unavailable on your system, use {% my supervisor_addon title="File Editor add-on" addon="core_configurator" %} instead. Again, details can be found [here](/common-tasks/supervised/#installing-and-using-the-file-editor-add-on). +How you edit your `configuration.yaml` file depends on your editor preferences and the [installation method](/installation/#advanced-installation-methods) you used to set up Home Assistant. -If you prefer to use a file editor on your computer, use the {% my supervisor_addon title="Samba add-on" addon="core_samba" %} to access the files as a network share. More details can be found [here](/common-tasks/supervised/#installing-and-using-the-samba-add-on). +### To set up access to the files and prepare an editor -The path to your configuration directory can be found in the Home Assistant {% term frontend %} by going to {% my system_health title="Settings > System > Repairs > System information from the top right menu" %} +Before you can edit a file, you need to know how to access files in Home Assistant and setup an editor. +File access depends on your [installation method](/installation/#advanced-installation-methods). If you use {% term "Home Assistant Operating System" %} or {% term "Home Assistant Supervised" %}, you can use editor add-ons, for example, but not if you use {% term "Home Assistant Core" %} or {% term "Home Assistant Container" %}. -![Show system menu option](/images/screenshots/System_information_menu.png) +1. To set up file access, follow the steps for your [installation method](/installation/#advanced-installation-methods): -Right under the version you are running, you will find what path Home Assistant has loaded the configuration from. -![Screenshot showing the top of the system information panel](/images/screenshots/System_information.png) + - [Configure file access on the Operating System](/common-tasks/os/#configuring-access-to-files): + - If you are unsure which option to choose, install the [file editor add-on](/common-tasks/os/#installing-and-using-the-file-editor-add-on). + - Alternatively, use the [Studio Code Server add-on](/common-tasks/os/#installing-and-using-the-visual-studio-code-vsc-add-on). This editor offers live syntax checking and auto-fill of various Home Assistant entities. But it looks more complex than the file editor. + - If you prefer to use a file editor on your computer, use the [Samba add-on](/common-tasks/os/#installing-and-using-the-samba-add-on). + - [Configure file access on Supervised](/common-tasks/supervised/#configuring-access-to-files): + - Using the [File editor add-on](/common-tasks/supervised/#installing-and-using-the-file-editor-add-on). + - Using the [Studio Code Server add-on](/common-tasks/supervised/#installing-and-using-the-visual-studio-code-vsc-add-on). + - Using the [Samba add-on](/common-tasks/supervised/#installing-and-using-the-samba-add-on). -_If you use Home Assistant Container, you can find `configuration.yaml` in the config folder that you mounted in your container._ +2. To look up the path to your configuration directory, go to {% my system_health title="**Settings** > **System** > **Repairs**" %}. + - Select the three dots menu and select **System information**. -_If you use Home Assistant Operating System, you can find `configuration.yaml` in the `/config` folder of the installation._ + ![Show system information option](/images/screenshots/System_information_menu.png) -_If you use Home Assistant Core, you can find `configuration.yaml` in the config folder passed to the `hass` command (default is `~/.homeassistant`)._ +3. Find out the location of the **Configuration directory**. -## Reloading changes + ![Screenshot showing the top of the system information panel](/images/screenshots/system_information.png) + - Unless you changed the file structure, the default is as follows: - + - {% term "Home Assistant Operating System" %}: the `configuration.yaml` is in the `/config` folder of the installation. + - {% term "Home Assistant Container" %}: the `configuration.yaml` is in the config folder that you mounted in your container. + - {% term "Home Assistant Core" %}: the `configuration.yaml` is in the config folder passed to the `hass` command (default is `~/.homeassistant`). -Most integrations in Home Assistant that do not interact with {% term devices %} or {% term services %} can reload changes made to their configuration in `configuration.yaml`. To do this, go to {% my server_controls title="Developer Tools > YAML" %} and scroll down to the YAML configuration reloading section (alternatively, hit "c" anywhere in the UI and search for it). +## Validating the configuration -If you can't see your integration listed there, you will need to restart Home Assistant for changes to take effect. +After changing configuration or automation files, you can check if the configuration is valid. A configuration check is also applied automatically when you reload the configuration or when you restart Home Assistant. -
+The method for running a configuration check depends on your [installation type](/installation/#advanced-installation-methods). Check the common tasks for your installation type: - To test any changes to your configuration files from the command line, check out the common tasks for [operating system](/common-tasks/os/#configuration-check), [supervised](/common-tasks/supervised/#configuration-check), [container](/common-tasks/container/#configuration-check), [core](/common-tasks/core/#configuration-check) for how to do that. Configuration changes can also be tested using the UI by navigating to {% my server_controls title="Developer Tools > YAML" %} and clicking "Check Configuration". For the button to be visible, you must enable "Advanced Mode" on your {% my profile title="User Profile" %}. +- [Configuration check on Operating System](/common-tasks/os/#configuration-check) +- [Configuration check on Supervised](/common-tasks/supervised/#configuration-check) +- [Configuration check on Container](/common-tasks/container/#configuration-check) +- [Configuration check on Core](/common-tasks/core/#configuration-check) -
+## Reloading the configuration to apply changes -## Migrating to a new system +For configuration changes to become effective, the configuration must be reloaded. Most integrations in Home Assistant (that do not interact with {% term devices %} or {% term services %}) can reload changes made to their configuration in `configuration.yaml` without needing to restart Home Assistant. -The preferred way of migrating to a new system is by {% my supervisor_backups title="making a backup" %}. Once you have created the backup on the old system, you can download it to the system that is running the Home Assistant frontend. When setting up the new system, you may use the backup. Alternatively, you can upload it to your new system using the _Upload backup_ menu option of the _Backups_ menu. Then, a restore of the uploaded backup on the new system concludes the migration. +1. Under **Settings**, select the three dots menu (top right), select **Restart Home Assistant** > **Quick reload**. -If you run the container or core installation methods, you will need to manually make a backup of your configuration folder. Be aware that some of the files you need start with `.`, which is hidden by default from both `ls` (in SSH), in Windows Explorer, and macOS Finder. You'll need to ensure that you're viewing all files before you copy them. + ![Settings, three dot menu, restart Home Assistant](/images/docs/configuration/settings_restart_ha.png) + +2. If you find that your changes were not applied, you need to restart. + - Select **Restart Home Assistant**. + - Note: This interrupts automations and scripts. + + ![Reload and restart buttons](/images/docs/configuration/reload_restart.png) + +## Troubleshooting the configuration + +If you run into trouble while configuring Home Assistant, refer to the [configuration troubleshooting page](/docs/configuration/troubleshooting/) and the [`configuration.yaml` examples](/examples/#example-configurationyaml). diff --git a/source/_docs/configuration/basic.markdown b/source/_docs/configuration/basic.markdown index 5fc503984b8..179d1a93475 100644 --- a/source/_docs/configuration/basic.markdown +++ b/source/_docs/configuration/basic.markdown @@ -1,117 +1,32 @@ --- title: "Setup basic information" description: "Setting up the basic info of Home Assistant." +related: + - docs: /integrations/homeassistant/ + - docs: /docs/configuration/ --- -As part of the default onboarding process, Home Assistant can detect your location from IP address geolocation. Home Assistant will automatically select a unit system and time zone based on this location. You may adjust this during onboarding, or afterwards at {% my general title="Settings > System > General" %}, network related configuration is found under {% my network title="Settings > System > Network" %}. +As part of the default onboarding process, Home Assistant can detect your location from IP address geolocation. Home Assistant will automatically select a unit system and time zone based on this location. If you didn't adjust this directly during onboarding, you can do it later. -If you prefer YAML, you can add the following information to your `configuration.yaml`: +

+ Screenshot showing General settings page + Screenshot showing the General settings page. +

-```yaml -homeassistant: - name: Home - latitude: 32.87336 - longitude: 117.22743 - elevation: 430 - unit_system: metric - currency: USD - country: US - time_zone: "America/Los_Angeles" - external_url: "https://www.example.com" - internal_url: "http://homeassistant.local:8123" - allowlist_external_dirs: - - "/usr/var/dumping-ground" - - "/tmp" - allowlist_external_urls: - - "http://images.com/image1.png" - media_dirs: - media: "/media" - recordings: "/mnt/recordings" -``` +The general settings described here are managed by the [Home Assistant Core integration](/integrations/homeassistant/). If you are interested in the services offered by this integration, check out the integration documentation. -
+## Editing the general settings - You will not be able to edit anything in {% my general title="Settings > System > General" %} in the UI if you are using YAML configuration for any of the following: name, latitude, longitude, elevation, unit_system, temperature_unit, time_zone, external_url, internal_url, country, currency. Additionally, some options are only visible after "Advanced Mode" is enabled on your {% my profile title="User Profile" %}. +To change the general settings that were defined during onboarding, follow these steps: -
+1. Go to {% my general title="**Settings** > **System** > **General**" %} and make your changes. +2. To change network-related configuration, such as the network name, go to {% my network title="**Settings** > **System** > **Network**" %}. +3. If some of the settings are not visible, you may need to enable **Advanced mode**. + - In the bottom left, select your username to go to your {% my profile title="**User profile**" %}, and enable **Advanced mode**. +4. **Troubleshooting**: If any of the settings are grayed out and can't be edited, this is because they are defined in the {% term "`configuration.yaml`" %} file. + - If you prefer editing the settings in the UI, you have to delete these entries from the {% term "`configuration.yaml`" %} file. + - For more information about the general settings in YAML, refer to the [Home Assistant Core integration documentation](/integrations/homeassistant/). -{% configuration %} -name: - description: Name of the location where Home Assistant is running. - required: false - type: string -latitude: - description: Latitude of your location required to calculate the time the sun rises and sets. - required: false - type: float -longitude: - description: Longitude of your location required to calculate the time the sun rises and sets. - required: false - type: float -elevation: - description: Altitude above sea level in meters. Impacts sunrise data. - required: false - type: integer -unit_system: - description: "`metric` for Metric, `us_customary` for US Customary. This also sets temperature_unit, Celsius for Metric and Fahrenheit for US Customary" - required: false - type: string -temperature_unit: - description: "Override temperature unit set by unit_system. `C` for Celsius, `F` for Fahrenheit." - required: false - type: string -time_zone: - description: "Pick your time zone from the column **TZ** of [Wikipedia's list of tz database time zones](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)" - required: false - type: string -currency: - description: "Pick your currency code from the column **Code** of [Wikipedia's list of ISO 4217 active codes](https://en.wikipedia.org/wiki/ISO_4217#Active_codes)" - required: false - type: string - default: "EUR" -external_url: - description: "The URL that Home Assistant is available on from the internet. For example: `https://example.duckdns.org:8123`. Note that this setting may only contain a protocol, hostname and port; using a path is not supported." - required: false - type: string -internal_url: - description: "The URL that Home Assistant is available on from your local network. For example: `http://homeassistant.local:8123`. Note that this setting may only contain a protocol, hostname and port; using a path is not supported." - required: false - type: string -customize: - description: "[Customize](/docs/configuration/customizing-devices/) entities." - required: false - type: string -customize_domain: - description: "[Customize](/docs/configuration/customizing-devices/) all entities in a domain." - required: false - type: string -customize_glob: - description: "[Customize](/docs/configuration/customizing-devices/) entities matching a pattern." - required: false - type: string -allowlist_external_dirs: - description: List of folders that can be used as sources for sending files. - required: false - type: list -allowlist_external_urls: - description: List of external URLs that can be fetched. URLs can match specific resources (e.g., `http://10.10.10.12/images/image1.jpg`) or a relative path that allows access to resources within it (e.g., `http://10.10.10.12/images` would allow access to anything under that path) - required: false - type: list -media_dirs: - description: A mapping of local media sources and their paths on disk. - required: false - type: map -language: - description: "Default language used by Home Assistant. This may, for example, influence the language used by voice assistants. The language should be specified as an RFC 5646 language tag, and must be a language which Home Assistant is translated to." - required: false - type: string - default: "en" -country: - description: "Country in which Home Assistant is running. This may, for example, influence radio settings to comply with local regulations. The country should be specified as an ISO 3166.1 alpha-2 code. Pick your country from the column **Code** of [Wikipedia's list of ISO 31661 alpha-2 officially assigned code codes](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements)" - required: false - type: string -{% endconfiguration %} + ![Setting fields are grayed out because the configuration settings stored in configuration.yaml file](/images/docs/configuration/general-settings-stored-in-config-yaml.png) -## Reload core service - -Home Assistant offers a service to reload the core configuration while Home Assistant is running called {% my developer_call_service service="homeassistant.reload_core_config" %}. This allows you to change any of the above sections and see it being applied without having to restart Home Assistant. To call this service, go to the "{% my developer_services %}" tab under {% my developer_services title="Developer Tools" %}, select the {% my developer_call_service service="homeassistant.reload_core_config" %} service and click the "CALL SERVICE" button. Alternatively, you can press the "Location & Customizations" button under {% my server_controls title="Developer Tools > YAML" %}. +5. To apply the changes, follow the steps on [reloading the configuration](/docs/configuration/#reloading-configuration-changes). diff --git a/source/_docs/configuration/customizing-devices.markdown b/source/_docs/configuration/customizing-devices.markdown index e289cdc10e8..2e47158f0be 100644 --- a/source/_docs/configuration/customizing-devices.markdown +++ b/source/_docs/configuration/customizing-devices.markdown @@ -1,129 +1,40 @@ --- title: "Customizing entities" description: "Simple customization for entities." +related: + - docs: /integrations/homeassistant/ + - docs: /docs/configuration/ + title: configuration.yaml file + - docs: /docs/configuration/troubleshooting/ + - docs: /docs/organizing/labels/ --- -## Changing the entity ID +## Customizing an entity -You can use the UI to change the entity ID and friendly name of supported entities. To do this: +After adding a new device, you might find the automatically assigned entity ID too technical and the entity lacking a friendly name. You can personalize these elements to better fit your naming conventions or modify other attributes like the icon. -1. Select the {% term entity %}, either from the frontend or by selecting the info button next to the entity in the Developer Tools "States" tab. -2. Select the cog icon in the right corner of the entity's dialog -![Entity dialog box.](/images/docs/configuration/customizing-entity-dialog.png) -3. Enter the new name or the new entity ID (remember not to change the domain of the entity - the part before the `.`) -![Settings for entity.](/images/docs/configuration/customizing-entity.png) -4. Select *Update* +To change entity attributes, follow these steps: -If your entity is not supported, or you cannot customize what you need via this method, please see below for more options. +1. Go to {% my entities title="**Settings** > **Devices & services** > **Entities**" %} and select the entity from the list. +2. In the top right corner, select the cog icon. -## Customizing entities + ![Entity dialog box with cog icon.](/images/docs/configuration/customizing-entity-dialog.png) -By default, all of your devices will be visible and have a default icon determined by their domain. You can customize the look and feel of your front page by altering some of these parameters. This can be done by overriding attributes of specific entities. +3. Enter or edit the attributes: + - For example, the entity ID here could be shortened to `binary_sensor.living_room_motion_1`. + - Do not change the domain of the entity - the part before the `.` (binary_sensor, in this example). + - You can use lowercase letters, numbers, and underscores. + - The ID must not start or end with an underscore. + - Enter or edit the friendly name. + - If needed, from the **Shown as** menu, you can select a different [device class](/integrations/homeassistant/#device-class). + - If you like, add a [label](/docs/organizing/labels/). -### Possible values + ![Settings for entity.](/images/docs/configuration/customizing-entity.png) -{% configuration customize %} -friendly_name: - description: Name of the entity as displayed in the UI. - required: false - type: string -entity_picture: - description: URL to use as picture for entity. - required: false - type: string -icon: - description: "Any icon from [Material Design Icons](https://pictogrammers.com/library/mdi/). Prefix name with `mdi:`, ie `mdi:home`. Note: Newer icons may not yet be available in the current Home Assistant release." - required: false - type: string -assumed_state: - description: For switches with an assumed state two buttons are shown (turn off, turn on) instead of a switch. By setting `assumed_state` to `false` you will get the default switch icon. - required: false - type: boolean - default: true -device_class: - description: Sets the class of the device, changing the device state and icon that is displayed on the UI (see below). It does not set the `unit_of_measurement`. - required: false - type: device_class - default: None -unit_of_measurement: - description: Defines the units of measurement, if any. This will also influence the graphical presentation in the history visualization as continuous value. Sensors with missing `unit_of_measurement` are showing as discrete values. - required: false - type: string - default: None -initial_state: - description: Sets the initial state for automations, `on` or `off`. - required: false - type: boolean - default: None -{% endconfiguration %} +4. To apply the changes, select **Update**. +5. If you have used this entity in automations and scripts, you need to rename the entity ID there, too. + - Go to {% my automations title="**Settings** > **Automations & Scenes**" %} open the respective tab and find your automation or script. -### Device class +### Customizing an entity in YAML -Device class is currently supported by the following platforms: - -- [Binary sensor](/integrations/binary_sensor/) -- [Button](/integrations/button/) -- [Cover](/integrations/cover/) -- [Humidifier](/integrations/humidifier/) -- [Media player](/integrations/media_player/) -- [Number](/integrations/number/) -- [Sensor](/integrations/sensor/) -- [Switch](/integrations/switch/) - -### Manual customization - -
- -If you implement `customize`, `customize_domain`, or `customize_glob` you must make sure it is done inside of `homeassistant:` or it will fail. - -
- -```yaml -homeassistant: - name: Home - unit_system: metric - # etc - - customize: - # Add an entry for each entity that you want to overwrite. - thermostat.family_room: - entity_picture: https://example.com/images/nest.jpg - friendly_name: Nest - switch.wemo_switch_1: - friendly_name: Toaster - entity_picture: /local/toaster.jpg - switch.wemo_switch_2: - friendly_name: Kitchen kettle - icon: mdi:kettle - switch.rfxtrx_switch: - assumed_state: false - media_player.my_media_player: - source_list: - - Channel/input from my available sources - # Customize all entities in a domain - customize_domain: - light: - icon: mdi:home - automation: - initial_state: "on" - # Customize entities matching a pattern - customize_glob: - "light.kitchen_*": - icon: mdi:description - "scene.month_*_colors": - icon: mdi:other -``` - -### Reloading customize - -Home Assistant offers a service to reload the core configuration while Home Assistant is running. This allows you to change your customize section and see your changes being applied without having to restart Home Assistant. - -To reload customizations, navigate to Developer Tools > YAML and then press the "Reload Location & Customizations" button. If you don't see this, enable Advanced Mode on your user profile page first. - -You can also use the [Quick bar](/docs/tools/quick-bar/#command-palette), and choose "Reload Location & Customizations". - -Alternatively, you can reload via service call. Navigate to Developer Tools > Services tab, select `homeassistant.reload_core_config` from the dropdown and press the "Call Service" button. - -
-New customize information will be applied the next time the state of the entity gets updated. -
+If your entity is not supported, or you could not customize what you need via the user interface, you need to edit the settings in your {% term "`configuration.yaml`" %} file. For a detailed description of the entity configuration variables and [device class](/integrations/homeassistant/#device-class) information, refer to the [Home Assistant Core integration documentation](/integrations/homeassistant/). diff --git a/source/_docs/configuration/packages.markdown b/source/_docs/configuration/packages.markdown index 010f4bd5e2b..b5b2126b6bf 100644 --- a/source/_docs/configuration/packages.markdown +++ b/source/_docs/configuration/packages.markdown @@ -19,7 +19,7 @@ The package configuration can include: `switch`, `light`, `automation`, `groups` It can be specified inline or in a separate YAML file using `!include`. -Inline example, main `configuration.yaml`: +Inline example, main {% term "`configuration.yaml`" %}: ```yaml homeassistant: @@ -34,7 +34,7 @@ homeassistant: ... ``` -Include example, main `configuration.yaml`: +Include example, main {% term "`configuration.yaml`" %}: ```yaml homeassistant: @@ -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 `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 YAML file. This entry in your {% term "`configuration.yaml`" %} will load all YAML-files in this _packages_ folder and its subfolders: ```yaml homeassistant: diff --git a/source/_docs/configuration/remote.markdown b/source/_docs/configuration/remote.markdown index ca8e06d94c5..c00987c0f93 100644 --- a/source/_docs/configuration/remote.markdown +++ b/source/_docs/configuration/remote.markdown @@ -1,6 +1,11 @@ --- title: "Remote access" description: "Setting up remote access for Home Assistant." +related: + - docs: /docs/configuration/securing/ + title: Securing your instance + - url: https://www.nabucasa.com/config/remote/ + title: Home Assistant Cloud - remote access --- If you're interested in logging in to Home Assistant while away, you'll have to make your instance remotely accessible. Below are a few options to do this. @@ -33,6 +38,14 @@ If you cannot access your Home Assistant installation remotely, remember to chec
-Just putting a port up is not secure. You should definitely consider encrypting your traffic if you are accessing your Home Assistant installation remotely. For details please check the [set up encryption using Let's Encrypt](/blog/2017/09/27/effortless-encryption-with-lets-encrypt-and-duckdns/) blog post or this [detailed guide](/docs/ecosystem/certificates/lets_encrypt/) to using Let's Encrypt with Home Assistant. +Just putting a port up is not secure. You should definitely consider encrypting your traffic if you are accessing your Home Assistant installation remotely. For details, please check the [set up encryption using Let's Encrypt](/blog/2017/09/27/effortless-encryption-with-lets-encrypt-and-duckdns/) blog post or this [detailed guide](https://community.home-assistant.io/t/certificate-authority-and-self-signed-certificate-for-ssl-tls/196970) to using Let's Encrypt with Home Assistant.
+ +## Adding a remote URL to Home Assistant + +To set the URL under which your Home Assistant can be accessed from outside your local network, follow these steps: + +1. In the bottom left, select your username to go to your {% my profile title="**User profile**" %}, and make sure **Advanced mode** is enabled. +2. Go to {% my network title="**Settings** > **System** > **Network**" %}. +3. Under **Home Assistant URL**, enter the external URL that you previously set up for your instance. diff --git a/source/_docs/configuration/secrets.markdown b/source/_docs/configuration/secrets.markdown index df67cfd8430..e06de57973d 100644 --- a/source/_docs/configuration/secrets.markdown +++ b/source/_docs/configuration/secrets.markdown @@ -1,15 +1,22 @@ --- title: "Storing secrets" description: "Storing secrets outside of your configuration.yaml." +related: + - docs: /docs/configuration/ + title: configuration.yaml file + - docs: /docs/configuration/splitting_configuration/ + title: Splitting the configuration + - docs: /docs/configuration/securing/ + title: Securing your instance --- -The `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 `configuration.yaml` file or even multiple YAML files if you [split up your configuration](/docs/configuration/splitting_configuration/). +The {% term "`configuration.yaml`" %} file is a plain-text file, thus it is readable by anyone who has access to the file. The file contains passwords and API tokens which need to be redacted if you want to share your configuration. By using `!secret` you can remove any private information from your configuration files. This separation can also help you to keep easier track of your passwords and API keys, as they are all stored at one place and no longer spread across the {% term "`configuration.yaml`" %} file or even multiple YAML files if you [split up your configuration](/docs/configuration/splitting_configuration/). ## Using `secrets.yaml` The workflow for moving private information to `secrets.yaml` is very similar to the [splitting of the configuration](/docs/configuration/splitting_configuration/). Create a `secrets.yaml` file in your Home Assistant [configuration directory](/docs/configuration/). -The entries for password and API keys in the `configuration.yaml` file usually looks like the example below. +The entries for password and API keys in the {% term "`configuration.yaml`" %} file usually looks like the example below. ```yaml rest: @@ -40,9 +47,9 @@ 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, -- next, parent folders will be searched for a `secrets.yaml` file with the secret, stopping at the folder with the main `configuration.yaml`. +- 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 Home Assistant Core installations given it's available through [`hass`](/docs/tools/hass/). +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/). *Option 1*: Print where secrets are retrieved from to the Home Assistant log by adding the following to `secrets.yaml`: diff --git a/source/_docs/configuration/securing.markdown b/source/_docs/configuration/securing.markdown index 18e5a015e9d..225abcf2517 100644 --- a/source/_docs/configuration/securing.markdown +++ b/source/_docs/configuration/securing.markdown @@ -1,6 +1,15 @@ --- title: "Securing" description: "Instructions on how to secure your Home Assistant installation." + +related: + - docs: /docs/configuration/ + - docs: /docs/configuration/secrets/ + title: Secrets.yaml file + - docs: /cloud/ + title: Home Assistant Cloud + - url: https://nabucasa.com/config/ + title: Nabu Casa --- One major advantage of Home Assistant is that it is not dependent on cloud services. Even if you are only using Home Assistant on a local network, you should take steps to secure your instance. @@ -9,9 +18,9 @@ One major advantage of Home Assistant is that it is not dependent on cloud servi Here's the summary of what you *must* do to secure your Home Assistant system: -- Centralize sensitive data in [secrets](/docs/configuration/secrets/) (but do remember to back them up) +- Centralize sensitive data in [secrets](/docs/configuration/secrets/) (but do remember to back them up). - **Note**: Storing secrets in `secrets.yaml` does not encrypt them. -- Regularly keep the system up to date +- Regularly keep the system up to date. ## Remote access @@ -23,9 +32,9 @@ To expose your instance to the internet, use a [VPN](https://pivpn.io), or an [S ### Extras for manual installations -Besides the above we advise that you consider the following to improve security: +Besides the above, we advise that you consider the following to improve security: -- For systems that use SSH set `PermitRootLogin no` in your sshd configuration (usually `/etc/ssh/sshd_config`) and to use SSH keys for authentication instead of passwords. This is particularly important if you enable remote access to your SSH services. +- For systems that use SSH, set `PermitRootLogin no` in your sshd configuration (usually `/etc/ssh/sshd_config`) and use SSH keys for authentication instead of passwords. This is particularly important if you enable remote access to your SSH services. - Lock down the host following good practice guidance, for example: - [Securing Debian Manual](https://www.debian.org/doc/manuals/securing-debian-manual/index.en.html) (this also applies to Raspberry Pi OS) - [Red Hat Enterprise Linux 7 Security Guide](https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/security_guide/index), [CIS Red Hat Enterprise Linux 7 Benchmark](https://www.cisecurity.org/cis-benchmarks/) diff --git a/source/_docs/configuration/splitting_configuration.markdown b/source/_docs/configuration/splitting_configuration.markdown index f5558c53bc7..582751ca0dd 100644 --- a/source/_docs/configuration/splitting_configuration.markdown +++ b/source/_docs/configuration/splitting_configuration.markdown @@ -1,17 +1,32 @@ --- title: "Splitting up the configuration" description: "Splitting the configuration.yaml into several files." +related: + - docs: /docs/configuration/ + title: configuration.yaml file + - docs: /examples/#example-configurationyaml + title: Example configuration files by the community + - docs: /docs/configuration/packages + title: Using packages to organize configuration files --- -So you've been using Home Assistant for a while now and your `configuration.yaml` file brings people to tears or you simply want to start off with the distributed approach, here's how to split the `configuration.yaml` into more manageable (read: humanly readable) pieces. +So you've been using Home Assistant for a while now and your {% term "`configuration.yaml`" %} file brings people to tears because it has become so large. Or, you simply want to start off with the distributed approach. Here's how to split the {% term "`configuration.yaml`" %} into more manageable (read: human-readable) pieces. -First off, several community members have sanitized (read: without API keys/passwords etc) versions of their configurations available for viewing, you can see a list of them [here](/examples/#example-configurationyaml). +## Example configuration files for inspiration -As commenting code doesn't always happen, please read on for the details. +First off, several community members have sanitized (read: without API keys/passwords) versions of their configurations available for viewing. You can see a [list of example files here](/examples/#example-configurationyaml). -Now despite the logical assumption that the `configuration.yaml` will be replaced by this process it will in fact remain, albeit in a much less cluttered form. +As commenting code doesn't always happen, please read on to learn in detail how configuration files can be structured. -In this lighter version we will still need what could be called the core snippet: +## Analyzing the configuration files + +In this section, we are going use some example configuration files and look at their structure and format in more detail. + +Now you might think that the {% term "`configuration.yaml`" %} will be replaced during the splitting process. However, it will in fact remain, albeit in a much less cluttered form. + +### The core configuration file + +In this lighter version, we will still need what could be called the core snippet: ```yaml homeassistant: @@ -27,9 +42,11 @@ homeassistant: customize: !include customize.yaml ``` +### Indentation, includes, comments, and modularization + Note that each line after `homeassistant:` is indented two (2) spaces. Since the configuration files in Home Assistant are based on the YAML language, indentation and spacing are important. Also note that seemingly strange entry under `customize:`. -`!include customize.yaml` is the statement that tells Home Assistant to insert the contents of `customize.yaml` at that point. This is how we are going to break a monolithic and hard to read file (when it gets big) into more manageable chunks. +`!include customize.yaml` is the statement that tells Home Assistant to insert the parsed contents of `customize.yaml` at that point. The contents of the included file must be yaml data that is valid at the location it is included. This is how we are going to break a monolithic and hard to read file (when it gets big) into more manageable chunks. Now before we start splitting out the different components, let's look at the other integrations (in our example) that will stay in the base file: @@ -51,9 +68,20 @@ mqtt: state_topic: "test/some_topic2" ``` -As with the core snippet, indentation makes a difference. The integration headers (`mqtt:`) should be fully left aligned (aka no indent), and the key (`sensor:`) should be indented two (2) spaces. The list `-` under the key `sensor` should be indented another two (2) spaces followed by a single space. The `mqtt` sensor list contains two (2) configurations containing two (2) keys each. +As with the core snippet, indentation makes a difference: -While some of these integrations can technically be moved to a separate file they are so small or "one off's" where splitting them off is superfluous. Also, you'll notice the # symbol (hash/pound). This represents a "comment" as far as the commands are interpreted. Put another way, any line prefixed with a `#` will be ignored. This makes breaking up files for human readability really convenient, not to mention turning off features while leaving the entry intact. +- The integration headers (`mqtt:`) should be fully left aligned (aka no indent). +- The key (`sensor:`) should be indented two (2) spaces. +- The list `-` under the key `sensor` should be indented another two (2) spaces followed by a single space. +- The `mqtt` sensor list contains two (2) configurations, with two (2) keys each. + +#### Comments + +The # symbol (hash/pound) represents a "comment" as far as the commands are interpreted. Put another way, any line prefixed with a `#` will be ignored by the software. It is for humans only. Comments allow breaking up files for readability, as well as turning off features while leaving the entry intact. + +#### Modularization and granularity + +While some of these integrations could technically be moved to a separate file, they are so small or "one off's" where splitting them off is superfluous. Now, lets assume that a blank file has been created in the Home Assistant configuration directory for each of the following: @@ -68,7 +96,7 @@ customize.yaml `automation.yaml` will hold all the automation integration details. `zone.yaml` will hold the zone integration details and so forth. These files can be called anything but giving them names that match their function will make things easier to keep track of. -Inside the base configuration file add the following entries: +Inside the base configuration file, add the following entries: ```yaml automation: !include automation.yaml @@ -78,9 +106,15 @@ switch: !include switch.yaml device_tracker: !include device_tracker.yaml ``` -Nesting `!include`s (having an `!include` within a file that is itself `!include`d) will also work. +#### Include statements and packages to split files -Some integrations support multiple top-level `!include`s, this includes integrations defining an IoT domain, e.g. `light`, `switch`, `sensor` as well as the `automation`, `script` and `template` integrations, if you give a different label to each one. Configuration for other integrations can instead be split up by using packages. To learn more about packages, see the [Packages](/docs/configuration/packages) page. +Nesting `!include` statements (having an `!include` within a file that is itself `!include`d) will also work. + +Some integrations support multiple top-level `!include` statements. This includes integrations defining an IoT domain. For example, `light`, `switch`, or `sensor`; as well as the `automation`, `script`, and `template` integrations, if you give a different label to each one. + +Configuration for other integrations can instead be split up by using packages. To learn more about packages, see the [Packages](/docs/configuration/packages) page. + +#### Top level keys Example of multiple top-level keys for the `light` platform. @@ -189,11 +223,11 @@ learn more about packages, see the [Packages](/docs/configuration/packages) page That about wraps it up. -If you have issues checkout `home-assistant.log` in the configuration directory as well as your indentations. If all else fails, head over to our [Discord chat server][discord] and ask away. +If you have issues, checkout `home-assistant.log` in the configuration directory as well as your indentations. If all else fails, head over to our [Discord chat server][discord] and ask away. ## Debugging configuration files -If you have many configuration files, Home Assistant provides a CLI that allows you to see how it interprets them, each installation type has its own section in the common-tasks about this: +If you have many configuration files, Home Assistant provides a CLI that allows you to see how it interprets them. Each installation type has its own section in the common-tasks about this: - [Operating System](/common-tasks/os/#configuration-check) - [Container](/common-tasks/container/#configuration-check) diff --git a/source/_docs/configuration/state_object.markdown b/source/_docs/configuration/state_object.markdown index 0b33f6bf7cb..4736c0da719 100644 --- a/source/_docs/configuration/state_object.markdown +++ b/source/_docs/configuration/state_object.markdown @@ -16,8 +16,9 @@ All states will always have an entity id, a state and a timestamp when last upda | `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_updated` | Time the state was written to the state machine in UTC time. Note that writing the exact same state including attributes will not result in this field being updated. Example: `2017-10-28 08:13:36.715874+00:00`. | -| `state.last_changed` | Time the state changed in the state machine in UTC time. This is not updated when there are only updated attributes. Example: `2017-10-28 08:13:36.715874+00:00`. | +| `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. | @@ -41,8 +42,8 @@ When an attribute contains spaces, you can retrieve it like this: `state_attr('s 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. -| Field | Description | -| ----- | ------------------------------------------------------------------- | -| context_id | Unique identifier for the context. | -| user_id | Unique identifier of the user that started the change. Will be `None` if action was not started by a user (ie. 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. | diff --git a/source/_docs/configuration/templating.markdown b/source/_docs/configuration/templating.markdown index f37252c9588..727e2f7ccf7 100644 --- a/source/_docs/configuration/templating.markdown +++ b/source/_docs/configuration/templating.markdown @@ -325,6 +325,32 @@ List of lights that are on with a brightness of 255: {% endraw %} + +### State translated + +Not supported in [limited templates](#limited-templates). + +The `state_translated` function returns a translated state of an entity using a language that is currently configured in the [general settings](https://my.home-assistant.io/redirect/general/). + +#### State translated examples + +{% raw %} + +```text +{{ states("sun.sun") }} # below_horizon +{{ state_translated("sun.sun") }} # Below horizon +{{ "sun.sun" | state_translated }} # Below horizon +``` + +```text +{{ states("binary_sensor.movement_backyard") }} # on +{{ state_translated("binary_sensor.movement_backyard") }} # Detected +{{ "binary_sensor.movement_backyard" | state_translated }} # Detected +``` + +{% endraw %} + + ### Working with groups Not supported in [limited templates](#limited-templates). @@ -432,6 +458,51 @@ The same thing can also be expressed as a test: {% endraw %} +### Floors + +- `floors()` returns the full list of floor IDs. +- `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. + +#### Floors examples + +{% raw %} + +```text +{{ floors() }} # ['floor_id'] +``` + +```text +{{ floor_id('First floor') }} # 'first_floor' +``` + +```text +{{ floor_id('my_device_id') }} # 'second_floor' +``` + +```text +{{ floor_id('sensor.sony') }} # 'first_floor' +``` + +```text +{{ floor_name('first_floor') }} # 'First floor' +``` + +```text +{{ floor_name('my_device_id') }} # 'Second floor' +``` + +```text +{{ floor_name('sensor.sony') }} # 'First floor' +``` + +```text +{{ floor_areas('first_floor') }} # ['living_room', 'kitchen'] +``` + +{% endraw %} + ### Areas - `areas()` returns the full list of area IDs @@ -482,10 +553,12 @@ The same thing can also be expressed as a test: {% endraw %} -### Integrations +### Entities for an integration - `integration_entities(integration)` returns a list of entities that are associated with a given integration, such as `hue` or `zwave_js`. -- `integration_entities(title)` if you have multiple instances set-up for an integration, you can also use the title you've set for the integration in case you only want to target a specific device bridge. +- `integration_entities(config_entry_title)` if you have multiple entries set-up for an integration, you can also use the title you've set for the integration in case you only want to target a specific entry. + +If there is more than one entry with the same title, the entities for all the matching entries will be returned, even if the entries are for different integrations. It's not possible to search for entities of an untitled integration. #### Integrations examples @@ -501,6 +574,78 @@ The same thing can also be expressed as a test: {% endraw %} +### Labels + +- `labels()` returns the full list of label IDs, or those for a given area ID, device ID, or entity ID. +- `label_id(lookup_value)` returns the label ID for a given label name. +- `label_name(lookup_value)` returns the label name for a given label ID. +- `label_areas(label_name_or_id)` returns the list of area IDs tied to a given label ID or name. +- `label_devices(label_name_or_id)` returns the list of device IDs tied to a given label ID or name. +- `label_entities(label_name_or_id)` returns the list of entity IDs tied to a given label ID or name. + +Each of the label template functions can also be used as a filter. + +#### Labels examples + +{% raw %} + +```text +{{ labels() }} # ['christmas_decorations', 'energy_saver', 'security'] +``` + +```text +{{ labels("living_room") }} # ['christmas_decorations', 'energy_saver'] +``` + +```text +{{ labels("my_device_id") }} # ['security'] +``` + +```text +{{ labels("light.christmas_tree") }} # ['christmas_decorations'] +``` + +```text +{{ label_id('Energy saver') }} # 'energy_saver' +``` + +```text +{{ label_name('energy_saver') }} # 'Energy saver' +``` + +```text +{{ label_areas('security') }} # ['driveway', 'garden', 'porch'] +``` + +```text +{{ label_devices('energy_saver') }} # ['deadbeefdeadbeefdeadbeefdeadbeef'] +``` + +```text +{{ label_entities('security') }} # ['camera.driveway', 'binary_sensor.motion_garden', 'camera.porch'] +``` + +{% endraw %} + +### Issues + +- `issues()` returns all open issues as a mapping of (domain, issue_id) tuples to the issue object. +- `issue(domain, issue_id)` returns a specific issue for the provided domain and issue_id. + +#### Issues examples + +{% raw %} + +```text +{{ issues() }} # { ("homeassistant", "deprecated_yaml_ping"): {...}, ("cloud", "legacy_subscription"): {...} } +``` + +```text +{{ issue('homeassistant', 'python_version') }} # {"breaks_in_ha_version": "2024.4", "domain": "homeassistant", "issue_id": "python_version", "is_persistent": False, ...} +``` + +{% endraw %} + ### Immediate if (iif) A common case is to conditionally return a value based on another value. @@ -587,12 +732,16 @@ For example, if you wanted to select a field from `trigger` in an automation bas {% endraw %} -- `as_datetime()` converts a string containing a timestamp, or valid UNIX timestamp, to a datetime object. +- `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 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 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. -- `relative_time` converts datetime object to its human-friendly "age" string. The age can be in second, minute, hour, day, month or year (but only the biggest unit is considered, e.g., if it's 2 days and 3 hours, "2 days" will be returned). Note that it only works for dates _in the past_. - - Using `relative_time()` will cause templates to be refreshed at the start of every new minute. +- `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. +- `time_until(datetime, precision)` converts a datetime object into a 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 past, returns 0 seconds. +A precision of 0 returns all available units, default is 1. - `timedelta` returns a timedelta object and accepts the same arguments as the Python `datetime.timedelta` function -- days, seconds, microseconds, milliseconds, minutes, hours, weeks. {% raw %} @@ -751,7 +900,7 @@ Examples: Not supported in [limited templates](#limited-templates). -- `distance()` will measure the distance in kilometers between home, entity, coordinates. +- `distance()` measures the distance between home, an entity, or coordinates. The unit of measurement (kilometers or miles) depends on the system's configuration settings. - `closest()` will find the closest entity. #### Distance examples @@ -916,7 +1065,10 @@ The numeric functions and filters raise an error if the input is not a valid num - `round(1, "half", default)` will always round to the nearest .5 value. `precision` should be 1 for this mode - Filter `value_one|bitwise_and(value_two)` perform a bitwise and(&) operation with two values. - Filter `value_one|bitwise_or(value_two)` perform a bitwise or(\|) operation with two values. +- Filter `value_one|bitwise_xor(value_two)` perform a bitwise xor(\^) operation with two values. - Filter `ord` will return for a string of length one an integer representing the Unicode code point of the character when the argument is a Unicode object, or the value of the byte when the argument is an 8-bit string. +- Filter `multiply(arg)` will convert the input to a number and multiply it by `arg`. Useful in list operations in conjunction with `map`. +- Filter `add(arg)` will convert the input to a number and add it to `arg`. Useful in list operations in conjunction with `map`. ### Complex type checking diff --git a/source/_docs/configuration/troubleshooting.markdown b/source/_docs/configuration/troubleshooting.markdown index 1033a4859bc..3390d996933 100644 --- a/source/_docs/configuration/troubleshooting.markdown +++ b/source/_docs/configuration/troubleshooting.markdown @@ -1,6 +1,10 @@ --- title: "Troubleshooting your configuration" description: "Common problems with tweaking your configuration and their solutions." +related: + - docs: /docs/configuration/ + - docs: /docs/configuration/customizing-devices/ + title: Changing entity name and ID --- It can happen that you run into trouble while configuring Home Assistant. Perhaps an integration is not showing up or is acting strangely. This page will discuss a few of the most common problems. @@ -17,7 +21,7 @@ If you have incorrect entries in your configuration files you can use the config ### Problems with the configuration -One of the most common problems with Home Assistant is an invalid `configuration.yaml` or other configuration file. +One of the most common problems with Home Assistant is an invalid {% term "`configuration.yaml`" %} or other configuration file. - Home Assistant provides a CLI that allows you to see how it interprets them, each installation type has its own section in the common-tasks about this: - [Operating System](/common-tasks/os/#configuration-check) @@ -25,7 +29,7 @@ One of the most common problems with Home Assistant is an invalid `configuration - [Core](/common-tasks/core/#configuration-check) - [Supervised](/common-tasks/supervised/#configuration-check) -- The configuration files, including `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. +- 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). @@ -96,7 +100,9 @@ The only characters valid in entity names are: - Numbers - Underscores -If you create an entity with other characters then Home Assistant may not generate an error for that entity. However you will find that 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 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/). ## Debug logs and diagnostics @@ -123,3 +129,14 @@ After you download logs, you will also want to download the diagnostics for the Example of Download Diagnostics Example of Download Diagnostics.

+ +### Handling unexpected restarts or crashes + +Suppose you find that Home Assistant unexpectedly restarts or crashes; it's likely that you have a misbehaving integration impacting system stability. Home Assistant has a built-in debug option that can help find implementation errors. It can also block many unsafe thread operations from crashing the system. Enabling debug has a slight performance impact on the system and is not recommended for long-term use. To enable debug, add the following to your {% term "`configuration.yaml`" %}: + +```yaml +homeassistant: + debug: true +``` + +Once debug is enabled, periodically check [Home Assistant System Logs](https://my.home-assistant.io/redirect/logs) for new messages. \ No newline at end of file diff --git a/source/_docs/configuration/yaml.markdown b/source/_docs/configuration/yaml.markdown index 6cd47527289..bbc31bf9c0c 100644 --- a/source/_docs/configuration/yaml.markdown +++ b/source/_docs/configuration/yaml.markdown @@ -1,13 +1,30 @@ --- -title: "YAML" -description: "Details about YAML to configure Home Assistant." +title: "YAML syntax" +description: "Details about the YAML syntax used to configure Home Assistant." +related: + - docs: /docs/configuration/ + title: configuration.yaml file + - docs: /docs/configuration/secrets/ + title: Storing private data in separate file + - docs: /docs/automation/yaml/ + title: Automation.yaml + - docs: /docs/configuration/troubleshooting/ + title: Troubleshooting the configuration files + - docs: /docs/configuration/#validating-the-configuration + title: Validating the configuration + - url: https://developers.home-assistant.io/docs/documenting/yaml-style-guide/ + title: YAML Style Guide for Home Assistant developers --- -Home Assistant uses the [YAML](https://yaml.org/) syntax for configuration. YAML might take a while to get used to but is powerful in allowing you to express complex configurations. +Home Assistant uses the [YAML](https://yaml.org/) syntax for configuration. While most integrations can be configured through the UI, some integrations require you to edit your [`configuration.yaml`](/docs/configuration/) file to specify its settings. -While more and more integrations are configured through the UI, for some, you will add code in your [`configuration.yaml`](/docs/configuration/) file to specify its settings. +## YAML Style Guide -The following example entry assumes that you would like to set up the [notify integration](/integrations/notify) with the [pushbullet platform](/integrations/pushbullet). +This page gives a high-level introduction to the YAML syntax used in Home Assistant. For a more detailed description and more examples, refer to the [YAML Style Guide for Home Assistant developers](https://developers.home-assistant.io/docs/documenting/yaml-style-guide/). + +## A first example + +The following YAML example entry assumes that you would like to set up the [notify integration](/integrations/notify) with the [pushbullet platform](/integrations/pushbullet). ```yaml notify: @@ -21,22 +38,20 @@ notify: The basics of YAML syntax are block collections and mappings containing key-value pairs. Each item in a collection starts with a `-` while mappings have the format `key: value`. This is somewhat similar to a Hash table or more specifically a dictionary in Python. These can be nested as well. **Beware that if you specify duplicate keys, the last value for a key is used**. +## Indentation in YAML + In YAML, indentation is important for specifying relationships. Indented lines are nested inside lines that are one level higher. In the above example, `platform: pushbullet` is a property of (nested inside) the `notify` integration. Getting the right indentation can be tricky if you're not using an editor with a fixed-width font. Tabs are not allowed to be used for indentation. The convention is to use 2 spaces for each level of indentation. -To check if your YAML syntax is correct before loading it into Home Assistant, you can use the third-party service [YAML Validator](https://codebeautify.org/yaml-validator/) (not maintained by the Home Assistant community). +## Comments -
+Strings of text following a `#` are comments. They are ignored by the system. Comments explain in plain language what a particular code block is supposed to do. For future-you or someone else looking at the file. -Pay attention to not storing private data (passwords, API keys, etc.) directly in your `configuration.yaml` file. Private data can be stored in either a [separate file](/docs/configuration/secrets/) or in [environmental variables](/docs/configuration/yaml/#using-environment-variables), which circumvents this security problem. - -
- -Strings of text following a `#` are comments and are ignored by the system. +### Example with comment and nesting The next example shows an [input_select](/integrations/input_select) integration that uses a block collection for the values of options. -The other properties (like `name:`) are specified using mappings. Note that the second line just has `threat:` with no value on the same line. Here threat is the name of the input_select and the values for it are everything nested below it. +The other properties (like `name:`) are specified using mappings. Note that the second line just has `threat:` with no value on the same line. Here, `threat` is the name of the input_select. The values for it are everything nested below it. ```yaml input_select: @@ -51,6 +66,8 @@ input_select: initial: 0 ``` +### Example of nested mapping + The following example shows nesting a collection of mappings in a mapping. In Home Assistant, this would create two sensors that each use the MQTT platform but have different values for their `state_topic` (one of the properties used for MQTT sensors). ```yaml @@ -65,8 +82,8 @@ sensor: ### Environment variables -On Home Assistant Core installations, you can include values from your system's environment variables with `!env_var`. -Note that this will only work for Home Assistant Core installations, in a scenario where it is possible to specify these. +On {% term "Home Assistant Core" %} installations, you can include values from your system's environment variables with `!env_var`. +Note that this will only work for {% term "Home Assistant Core" %} installations, in a scenario where it is possible to specify these. Regular Home Assistant users are recommended to use `!include` statements instead. ```yaml @@ -120,3 +137,9 @@ Not quoting the value may generate an error such as: ```txt not a valid value for dictionary value @ data ``` + +## Validating YAML syntax + +With all these indents and rules, it is easy to make a mistake. The best way to check if your YAML syntax is correct (validate) depends on the editor you use. We can't list them all here. + +- If you edit the files directly in Home Assistant, refer to the section: [Validating the configuration](/docs/configuration/#validating-the-configuration) diff --git a/source/_docs/energy/faq.markdown b/source/_docs/energy/faq.markdown index 25fce51be53..2c6a524d865 100644 --- a/source/_docs/energy/faq.markdown +++ b/source/_docs/energy/faq.markdown @@ -15,7 +15,7 @@ Think of this in a parallel to speed and distance: Power is the speed you are go Therefore Energy (kiloWatt-hour) is not an average of the Power you are consuming over a given period of time (the unit of the average power would be Watt or kiloWatt again). Energy is the integral (mathematical operation) of the Power function. -This difference is very important as you need to use the proper entities in our Energy Panel. +This difference is very important as you need to use the proper entities in our Energy dashboard. ## Creating an Energy Sensor out of a Power Sensor @@ -29,9 +29,9 @@ If you are using a 3rd party device (e.g. not reading directly from your utility To accomplish such, you can use the [utility_meter integration](/integrations/utility_meter/). With this integration, you define as many tariffs as required (in accordance with your utility provider contract) and HA will be able to differentiate energy consumptions in each of the tariffs. Please note that each utility provider has its own time schedules for peak and off-peak and you are required to create an automation that switches the utility_meter entity from one tariff to the other. -## The energy panel is not visible +## The energy dashboard is not visible -If you do not see the Energy panel in the sidebar, make sure you have not removed [`default_config:`](/integrations/default_config/) from your `configuration.yaml`. If you have, you will need to add the `energy:` integration manually. +If you do not see the Energy dashboard in the sidebar, make sure you have not removed [`default_config:`](/integrations/default_config/) from your {% term "`configuration.yaml`" %}. If you have, you will need to add the `energy:` integration manually. ## Troubleshooting missing entities diff --git a/source/_docs/energy/gas.markdown b/source/_docs/energy/gas.markdown index ae0f109e834..197b665e905 100644 --- a/source/_docs/energy/gas.markdown +++ b/source/_docs/energy/gas.markdown @@ -31,4 +31,4 @@ We have worked with creator [Marcel Zuidwijk](https://www.zuidwijk.com) to devel #### Read the Gas Meter using a magnetometer -[Diaphragm gas meters](https://en.wikipedia.org/wiki/Gas_meter#Diaphragm/bellows_meters) are the most common type of gas meter, and their movement can frequently be observed with a magnetometer. The [QMC5883L](https://esphome.io/components/sensor/qmc5883l.html) is a common and inexpensive option that ESPHome supports. Many posts on the forums of users having luck with this method, such as [this one](https://community.home-assistant.io/t/water-gas-meter-monitoring-via-magnetometer-sine-wave-to-pulse-issue/245904). +[Diaphragm/bellows gas meters](https://en.wikipedia.org/wiki/Gas_meter#Diaphragm/bellows_meters) are the most common type of gas meter, seen in almost all residential installations, and their movement can frequently be observed with a magnetometer. The [QMC5883L](https://esphome.io/components/sensor/qmc5883l.html) and [HMC5883L](https://esphome.io/components/sensor/hmc5883l.html) are common and inexpensive options that ESPHome supports. A project that makes it easy to use these magnetometers and calibrate them is [this water-gas-meter project on GitHub](https://github.com/tronikos/esphome-magnetometer-water-gas-meter). diff --git a/source/_docs/energy/individual-devices.markdown b/source/_docs/energy/individual-devices.markdown index 6e17a2516a5..ec6222a18c2 100644 --- a/source/_docs/energy/individual-devices.markdown +++ b/source/_docs/energy/individual-devices.markdown @@ -19,6 +19,6 @@ Smart relays sit behind your "normal" switches and make them smart. It allows yo ## Devices with power (W) sensors -Some smart devices, such as air conditioning, boilers, and others, may provide a power sensor, measured in Watts. You can use the [Integration (Riemann sum integral) integration](/integrations/integration/#energy) to calculate the energy your device is using. You can then use the energy sensor in the Energy Dashboard, as individual devices. +Some smart devices, such as air conditioning, boilers, and others, may provide a power sensor, measured in Watts. You can use the [Integration (Riemann sum integral) integration](/integrations/integration/#energy) to calculate the energy your device is using. You can then use the energy sensor in the Energy Dashboard, as individual devices. For information on setting up an entity for use in the **Energy** dashboard, refer to the [energy FAQ](/docs/energy/faq/#troubleshooting-missing-entities). Graphic showing energy flowing from the home to individual devices. diff --git a/source/_docs/energy/water.markdown b/source/_docs/energy/water.markdown index 496f83b70b4..1db39015429 100644 --- a/source/_docs/energy/water.markdown +++ b/source/_docs/energy/water.markdown @@ -5,32 +5,66 @@ description: "Learn how to add information about your water usage to Home Assist Home Assistant allows you to track your water usage in the home energy management too. -Although water is not strictly "energy", it is still a valuable resource to track and monitor as it is often tightly coupled with energy usage (like gas). Additionally, it can help you reduce your ecological footprint by using less water. +Although water usage is not strictly "energy", it is still a valuable resource to track and monitor as it is often tightly coupled with energy usage (like gas). Additionally, it can help you reduce your ecological footprint by using less water. -## Hardware +### Home water meters -Home Assistant will need to know the amount of water that is being consumed in order to be able to track it. Several hardware options are available to do this. +There are several ways to measure water usage in your home. Multiple methods exist for reading your water usage. Older water meters typically feature a common arrow or only display total consumption. For these meters, you may require an [AI-on-the-edge-device](https://github.com/jomjol/AI-on-the-edge-device) with an ESP32 camera. While effective, this solution can be tedious to set up as it leans towards a DIY approach. + +Newer water meters are equipped with a rotary disk that can be read using two methods. The first method utilizes light sensors, while the second method employs proximity sensors. The proximity sensor detects changes in the magnetic field, with each rotation of the disk representing one liter of water used. Meanwhile, the light sensor method operates on an autocorrelation technique, providing accuracy down to 100 milliliters instead of the traditional one-liter step. + +For most water meters, the rotary encoder disk suffices the light sensor version. However, some older or specialized meters may necessitate the use of a proximity meter instead. + +Home Assistant also has integrations build into the platform that connect with existing products + +## Home Assistant integrations + +Home Assistant will need to know the amount of water that is being consumed to be able to track usage. Several [water metering (fluid flow rate sensor device)](https://en.wikipedia.org/wiki/Water_metering) hardware options are available to do this. Depending on your setup, the required hardware is provided by your public water utility company, or you may need to buy your own. + +Some hardware with water meters may also provide additional practical functions or sensors, such as [valve](/integrations/valve), for example, for controlling water shutoff, or temperature and pressure (to enable freeze alarms). We have the following integrations available for existing products that can provide information about water usage: - [Flo](/integrations/flo) - [Flume](/integrations/flume) - [HomeWizard Energy](/integrations/homewizard) +- [StreamLabs](/integrations/streamlabswater) +- [Suez Water](/integrations/suez_water) -Alternatively, the following shops sell ESPHome-based devices, that use a proximity sensor to detect a rotating magnet in your water meter and use that pulse to count each liter of water used. +There are also products for water usage monitoring that are based on existing common IoT protocol standards: -- [S0tool](https://huizebruin.github.io/s0tool/) ("Made for ESPHome" approved) +- [Z-Wave](/integrations/zwave_js) +- [Zigbee](/integrations/zha) +- [Matter (BETA)](/integrations/matter) + + +## Community-made sensors + +If your water meter lacks a rotary disk, magnetic disk, or coil. There are alternative solutions available to seamlessly integrate water monitoring into your smart home setup: + +- [AI-on-the-edge-device](https://github.com/jomjol/AI-on-the-edge-device) is a project running on an ESP32-CAM and can be fully integrated into Home Assistant using the Home Assistant Discovery Functionality of MQTT. It digitalizes your gas/water/electricity meter display and provides its data in various ways.![Photo of the AI-on-the-edge-device Workflow](/images/docs/energy/ + +If you have a Culligan Water Softener, you may be able to interface with the inbuilt `DEBUG PORT` and receive water usage stats including `Gallons` (gal), `Gallons Per Minute` (gal/min), and `Gallons to Recharge` (gal): + +- [cullAssistant](https://github.com/LelandSindt/cullAssistant) (ESPHome) + +Alternatively, the following shops sell ESPHome-based devices that use a 3-phase light sensor to detect a rotating disk in your water meter and convert this to the amount of water used in milliliters (ml): +- [Muino water meter reader](https://watermeter.muino.nl/) (ESPHome) + +Alternatively, the following shops sell ESPHome-based devices, that use a proximity sensor to detect a rotating magnet in your water meter and use that pulse to count each liter of water used: +- [S0tool](https://s0tool.nl/) ("Made for ESPHome" approved) - [Waterlezer dongle](https://smart-stuff.nl/product/esphome-waterlezer-dongle/) (Dutch) - [Slimme Watermeter Gateway](https://smartgateways.nl/product/slimme-watermeter-gateway/) (Dutch) - [watermeterkit.nl](https://watermeterkit.nl/) (Dutch) -Alternatively, the following shops sell ESPHome-based devices that use a 3-phase light sensor to detect a rotating disk in your water meter and convert this to the amount of water used in milliliters (ml). -- [Muino water meter reader](https://watermeter.muino.nl/) +## DIY Maybe you like to build one yourself? - - Pieter Brinkman has quite a [nice blog article on how to create your own water sensor](https://www.pieterbrinkman.com/2022/02/02/build-a-cheap-water-usage-sensor-using-esphome-home-assistant-and-a-proximity-sensor/) using ESPHome, or [build a water meter](https://www.ztatz.nl/p1-monitor-watermeter/) that works with the [P1 Monitor](/integrations/p1_monitor) integration. - - [AI-on-the-edge-device](https://github.com/jomjol/AI-on-the-edge-device) is a project running on an ESP32-CAM and can be fully integrated into Home Assistant using the Home Assistant Discovery Functionality of MQTT. It digitalizes your gas/water/electricity meter display and provides its data in various ways.![Photo of the AI-on-the-edge-device Workflow](/images/docs/energy/ai-on-the-edge-device.jpg) - - [watermeter](https://github.com/nohn/watermeter) running classic OCR and statistical pattern recognition on any system supporting Docker +- Pieter Brinkman has quite a [nice blog article on how to create your own water sensor](https://www.pieterbrinkman.com/2022/02/02/build-a-cheap-water-usage-sensor-using-esphome-home-assistant-and-a-proximity-sensor/) using ESPHome, or [build a water meter](https://www.ztatz.nl/p1-monitor-watermeter/) that works with the [P1 Monitor](/integrations/p1_monitor) integration. +- [AI-on-the-edge-device](https://github.com/jomjol/AI-on-the-edge-device) is a project running on an ESP32-CAM and can be fully integrated into Home Assistant using the Home Assistant Discovery Functionality of MQTT. It digitalizes your gas/water/electricity meter display and provides its data in various ways.![Photo of the AI-on-the-edge-device Workflow](/images/docs/energy/ai-on-the-edge-device.jpg) +- [watermeter](https://github.com/nohn/watermeter) running classic OCR and statistical pattern recognition on any system supporting Docker +- [Muino water meter reader 3-phase](https://muino.nl/product/3-phase-muino-light-sensor-encoder/) Using the 3-phase sensor technique, a battery-powered version can be possible with this sensor. +- [Read water meter with magnetometer](https://github.com/tronikos/esphome-magnetometer-water-gas-meter) using [QMC5883L](https://esphome.io/components/sensor/qmc5883l.html) or [HMC5883L](https://esphome.io/components/sensor/hmc5883l.html), common and inexpensive magnetometers. This should be compatible with all the water meters the Flume water sensor is compatible with, which is [compatible](https://help.flumewater.com/en/articles/1618594-is-the-flume-device-compatible-with-all-water-meters) with about 95% of water meters in the United States. If you manually integrate your sensors, for example, using the [MQTT](/integrations/mqtt) or [RESTful](/integrations/rest) integrations: Make sure you set and provide the `device_class`, `state_class`, and `unit_of_measurement` for those sensors. diff --git a/source/_docs/frontend/browsers.markdown b/source/_docs/frontend/browsers.markdown deleted file mode 100644 index 18afa58b960..00000000000 --- a/source/_docs/frontend/browsers.markdown +++ /dev/null @@ -1,93 +0,0 @@ ---- -title: "Browsers" -description: "Browser compatibility list" ---- - -Home Assistant requires a web browser to show the frontend and supports all major modern browsers. We don't test the web interface against all available browsers but this page tracks different browsers on various operating systems and should help you to pick a browser which works. The "Release" column contains the release number which was tested. This doesn't mean that older or newer releases will not work. - -If a browser is listed as working but you are still having problems, it is possible that some add-on or extension may be the problem. Some add-ons or extension are known to cause issue with the frontend, but it's not possible to test them all. - -If you are having issues with the frontend displaying correctly, you should disable all your add-ons or extensions and enable them one at a time. At last but not least, consider restarting your browser. - -We would appreciate if you help to keep this page up-to-date and add feedback. - -## Microsoft Windows - -| Browser | Release | State | Comments | -| :------------------------ |:---------------|:-----------|:-------------------------| -| Internet Explorer ([IE]) | 11 | Not supported | Does not support promises. | -| Microsoft [Edge] | deli. Win 10 | works | Streaming updates not working. | -| [Chrome] | 61.0.3163.100 | works | | -| [Firefox] | 62.0.3 | works | | -| [Iridium] | 48.2 | works | | -| [Opera] | 42.0.2393.351 | works | | - -## macOS - -| Browser | Release | State | Comments | -| :-------------------- |:---------------|:-----------|:-------------------------| -| [Safari] | | works | Not working with Safari Technology Preview 112 beta | - -## Linux - -| Browser | Release | State | Comments | -| :-------------------- |:---------------|:-----------|:-------------------------| -| [Firefox] | 62.0 | works | | -| [Midori] | 0.5.11 | works | | -| [Chromium] | 69.0.3497.81 | works | | -| [Conkeror] | 1.0.2 | works | | -| [Tor Browser] | 7.0.8 | works | | -| [Konqueror] | | unknown | | -| [Uzbl] | 0.9.0 | works | | -| [Opera] | 42.0.2393.351 | works | | -| [Lynx] | 2.12 | fails | loads empty page | -| [elinks] | | fails | page with manifest and import | -| [w3m] | 0.5.3 | fails | display the icon shown while loading HA | -| [Epiphany] | 3.18.5 | works | | -| [surf] | 0.7 | works | | -| [Chrome] | 71.0.3578.98 | works | | -| [Waterfox] | 56.2.6 | fails | | - -## Android - -| Browser | Release | State | Comments | -| :-------------------- |:---------------|:-----------|:-------------------------| -| [Chrome] | 50.0.2661.89 | works | Can also be added to desktop | -| [Firefox] | 46.0.1 | works | Can also be added to desktop | -| [Opera] | 42.0.2246.112628 | works | Can also be added to desktop | - -## iOS - -| Browser | Release | State | Comments | -| :-------------------- |:---------------|:-----------|:-------------------------| -| [Safari] | | works | Can also be added to desktop. Not working in iOS 14 beta 5. | -| [Chrome] | | works | Not working in iOS 14 beta 5. | - -There are reports that devices running with iOS prior to iOS 10, especially old iPads, are having trouble. Devices running iOS 14 beta 5, you will not be able to interact with Home Assistant controls. - -## webOS - -| Browser | Release | State | Comments | -| :-------------------- |:---------------|:-----------|:-------------------------| -| [LG webOS TV Built-in]| webOS 04.80.03 | works | including magic remote | - -[Chrome]: https://www.google.com/chrome/ -[Chromium]: https://www.chromium.org/ -[Conkeror]: http://conkeror.org/ -[Edge]: https://www.microsoft.com/en-us/edge -[elinks]: http://elinks.or.cz/ -[Epiphany]: https://wiki.gnome.org/Apps/Web -[Firefox]: https://www.mozilla.org/en-US/firefox/ -[IE]: https://support.microsoft.com/en-us/help/17621/internet-explorer-downloads -[Iridium]: https://iridiumbrowser.de/ -[Konqueror]: https://konqueror.org/ -[Lynx]: https://lynx.browser.org/ -[Midori]: https://astian.org/en/midori-browser/ -[Opera]: https://www.opera.com/ -[Safari]: https://www.apple.com/safari/ -[surf]: https://surf.suckless.org/ -[Tor Browser]: https://www.torproject.org/ -[Uzbl]: https://www.uzbl.org/ -[w3m]: https://w3m.sourceforge.net/ -[Waterfox]: https://www.waterfox.net -[LG webOS TV Built-In]: https://www.lg.com/uk/support/help-library/details-on-enjoying-internet-browsing-on-your-lg-webos-tv-CT00008334-1435838149474 diff --git a/source/_docs/locked_out.md b/source/_docs/locked_out.md index dd4be294f07..0132a46419a 100644 --- a/source/_docs/locked_out.md +++ b/source/_docs/locked_out.md @@ -1,15 +1,22 @@ --- title: "I'm locked out!" description: "Options for regaining access" +related: + - docs: /common-tasks/os/#listing-all-users-from-the-command-line + title: Listing all usernames via command line + - url: https://yellow.home-assistant.io/guides/factory-reset/ + title: Reset the Yellow + - url: https://green.home-assistant.io/guides/reset/ + title: Reset the Green --- The sections below deal with recovering from a situation where you are not able to sign in, or need to recover your data. -## Forgot user name +## Forgot username If you’ve forgotten your username, ask the owner to help you. -If you are the owner and have forgotten your user name, then you need to [prepare the system to start a new onboarding process](/docs/locked_out/#to-prepare-the-system-to-start-a-new-onboarding-process). +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. ## Forgot password @@ -49,9 +56,9 @@ Use this procedure only if the following conditions are met: - [Using the terminal](https://green.home-assistant.io/guides/use-terminal/) - If you are using another board, connect a keyboard and monitor to your device and access the terminal. The procedure is likely very similar to the one described for the Green in the step above. 2. Once you have opened the Home Assistant command line, enter the following command: - - Note: `existing_user` is a placeholder. Replace it with your user name. + - 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**: `ha auth reset --username existing_user --password new_password` - **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. 3. You can now log in to Home Assistant using this new password. diff --git a/source/_docs/organizing.markdown b/source/_docs/organizing.markdown new file mode 100644 index 00000000000..5091baaac10 --- /dev/null +++ b/source/_docs/organizing.markdown @@ -0,0 +1,55 @@ +--- +title: "Grouping your assets" +description: "Grouping your assets makes it easier to find them and allows you to target groups in automations." +related: + - docs: /docs/organizing/areas/ + title: Areas + - docs: /docs/organizing/floors/ + title: Floors + - docs: /docs/organizing/labels/ + title: Labels + - docs: /docs/organizing/categories/ + title: Categories +--- + +Once you have more devices, you may want to target entire groups of devices in automations. It also becomes more challenging to find items in lists. There are a few tools to group your assets: [Areas](#areas), [floors](#floors), [labels](#labels), and [categories](#categories). + +| Taxonomy | Automation target | Entity can have multiple | +| -------- | ----------------- | ------------------------ | +| Area | ✅ | ❌ | +| Floor | ✅ | ❌ | +| Label | ✅ | ✅ | +| Category | ❌ | ❌ | + +## Area + +- Groups {% term devices %} and {% term entities %}. +- Can be assigned to one floor. +- Reflects a physical area (or room) in your home. +- Can be used in automations: Allows targeting an entire group of devices with a service call. For example, turning off all the lights in the living room. + +- Areas can also be used to automatically generate cards, such as the [Area card](/dashboards/area/). + +## Floor + +- Groups areas. +- {% term Devices %} and {% term entities %} cannot be assigned to floors, but to areas only. +- Can have multiple areas. +- Can be used in automations and scripts as a target for actions. For example, to turn off all the lights on the downstairs floor when you go to bed. + +Screenshots showing areas settings page, which now also shows the areas grouped by floor. + +## Labels + +- Can be assigned to areas, devices, entities, automations, scenes, scripts, and helpers. +- Can be used in automations and scripts as a target for actions and services. +- Labels can also be used to filter data in tables. For example, you can filter the list of devices to show only devices with the label `heavy energy usage` or turn these devices off when there is not a lot of solar energy available. + +Screenshots showing the new labels assigned to automations. + +## Category + +- Groups items in a table. +- Categories are unique for each table. The automations page can have different categories than the scene, scripts, or helpers settings page. + +Screenshots the new categories. Automations are grouped into their categories, making it easier to get an overview or to filter them. diff --git a/source/_docs/organizing/areas.markdown b/source/_docs/organizing/areas.markdown new file mode 100644 index 00000000000..6af4f1434ba --- /dev/null +++ b/source/_docs/organizing/areas.markdown @@ -0,0 +1,90 @@ +--- +title: "Areas" +description: "Group your devices and entities in areas and group areas in floors." +related: + - docs: /docs/organizing/areas/ + title: Areas + - docs: /docs/organizing/ + - docs: /docs/organizing/labels/ + title: Labels + - docs: /docs/organizing/categories/ + title: Categories + - docs: /docs/configuration/templating/#areas + title: Using areas in template +--- + +An area in Home Assistant is a logical grouping of {% term devices %} and {% term entities %} that are meant to match areas (or rooms) in the physical world of your home. For example, the "Living room" area groups devices and entities in your living room. Areas allow you to target an entire group of devices with a service call. For example, turning off all the lights in the living room. +Areas can be assigned to floors. Areas can also be used to automatically generate cards, such as the [Area card](/dashboards/area/). + +## Creating an area + +Follow these steps to create a new area from the **Areas** view. + +1. Go to {% my areas title="**Settings** > **Areas, labels & zones**" %} and select **Create area**. +2. In the dialog, enter the area details: + - Give the area a **Name** (required). + - Add an icon (We use [Material icons](https://pictogrammers.com/library/mdi/)). + - Assign the area to a floor. + - If you have not created floors yet, you can [create a new one](/docs/organizing/floors/#creating-a-floor). + - The number can be negative. For example for underground floors. + - This number can later be used for sorting. + - Add an image representing that area. + - Add an **Alias**. + - Aliases are alternative names used in [voice assistants](/voice_control/aliases/) to refer to an area, entity, or floor. + + ![Create area dialog](/images/organizing/create_area_01.png) +3. Select **Add**. + + **Result**: A new area is created. + +## Assigning areas to floors and add labels + +If an area has not yet been assigned to a floor, it is shown in the **Unassigned areas** section. Follow these steps to assign an area to a floor. + +1. Go to {% my areas title="**Settings** > **Areas, labels & zones**" %} and select **Create area**. +2. On the area card, select the pencil icon. +3. In the dialog, select the floor and add labels, if you like. + +## Assigning an area to multiple items + +You can assign an area to multiple items at once in the automation, scene, script, and device pages. + +1. Depending on what you want to assign, go to one of the following pages: + - For automations, scripts, or scenes {% my automations title="**Settings** > **Automations & Scenes**" %} and open the respective tab. + - For devices, go to {% my devices title="**Settings** > **Devices & services** > **Devices**" %}. +2. In the list, [select all the items](/docs/organizing/filtering#selecting-multiple-items-in-a-table) you want to assign to an area. + + ![Screenshot showing how to assign multiple devices to an area](/images/organizing/area_assign_devices.png) + +3. In the top right corner, select **Move to area** and select the target area from the list. + +## Editing an area + +Follow these steps to edit an area. + +1. Go to {% my areas title="**Settings** > **Areas, labels & zones**" %} and on the area card, select the pencil icon. +2. In the dialog, adjust the area details you want to change: + - Edit the area **Name**. + - Add an icon (We use [Material icons](https://pictogrammers.com/library/mdi/)). + - Assign the area to a floor. + - If you have not created floors yet, you can [create a new one](/docs/organizing/floors/#creating-a-floor). + - The number can be negative. For example for underground floors. + - This number can later be used for sorting. + - Add an image representing that area. + - Add an **Alias**. + - Aliases are alternative names used in [voice assistants](/voice_control/aliases/) to refer to an area, entity, or floor. + +## Deleting an area + +Follow these steps to delete an area. It will be removed from all the floors it was assigned to. All the devices that were assigned to this area will become unassigned. +If you used this area in automations or script as targets, or with voice assistant, these will no longer work. + +1. Go to {% my areas title="**Settings** > **Areas, labels & zones**" %} and select the area card. +2. In the top right corner, select the three dot menu. Then, select **Delete**. + + ![Delete area](/images/organizing/area_delete.png) + +3. If you used this area in automations or script as targets, or with voice assistant, they will no longer work. + - You can adjust or delete the related scripts or automations. +4. If you still had devices in that area, they are no longer assigned to any room. + - If you have moved the devices, you can now reassign them to a new area. diff --git a/source/_docs/organizing/categories.markdown b/source/_docs/organizing/categories.markdown new file mode 100644 index 00000000000..261332fbc02 --- /dev/null +++ b/source/_docs/organizing/categories.markdown @@ -0,0 +1,56 @@ +--- +title: "Categories" +description: "Use categories to group and filter your table items" +related: + - docs: /docs/organizing/areas/ + title: Areas + - docs: /docs/organizing/floors/ + title: Floors + - docs: /docs/organizing/labels/ + title: Labels +--- + +Categories let you group and filter items in a table. Like labels, categories allow grouping irrespective of the items physical location. For example, on the automations page, you can create the categories “Notifications” or “NFC tags” to view your automations grouped or filtered. These categories group automations on the automation page, but have no effect anywhere else. Categories are unique for each table. The automations page can have different categories than the scene, scripts, or helpers settings page. + +## Creating a category + +Follow these steps to create a new category. + +1. Go to {% my automations title="**Settings** > **Automations & Scenes**" %} and open the respective tab. +2. In the top left, select the **Filters** button. + + ![Select the filter button](/images/organizing/filters_01.png) +3. Select **Category**, then **Add category**. +4. Enter a name, select an icon and select **Add**. + + **Result**: A new category is created. + +## Assigning a category + +1. Go to {% my automations title="**Settings** > **Automations & Scenes**" %} and open the respective tab. +2. To assign a category to a single item: + - Find the item in the list and select the three dots menu. + - Select **Assign category** and select the category from the list. + - If the category is not in the list, select **Add new category** and make a new one. +3. To assign a category to multiple items: + - Select the Multiselect icon button. + - From the list, select all the items to which you want to apply a category. + - In the top right corner, select **Move to category**. + - Then, select the category from the list. +4. Once categories are applied, the table items are grouped by those categories. + - The example shows 2 categories: Coffee and housekeeping. + + ![Group table items by category](/images/organizing/category_02.png) + +## Editing or deleting a category + +To rename or delete a category, follow these steps: + +1. Go to {% my automations title="**Settings** > **Automations & Scenes**" %} and open the respective tab. +2. In the top left, select the **Filters** button. + + ![Select the filter button](/images/organizing/filters_01.png) +3. In the list, find the category you want to edit and select the three dot menu next to it. +4. Select **Edit category** or **Delete category**. + + ![Screenshot showing the edit and delete buttons for categories](/images/organizing/edit-delete-category.png) diff --git a/source/_docs/organizing/filtering.markdown b/source/_docs/organizing/filtering.markdown new file mode 100644 index 00000000000..d8fa65532d7 --- /dev/null +++ b/source/_docs/organizing/filtering.markdown @@ -0,0 +1,62 @@ +--- +title: "Filtering your assets" +description: "Filter for items in tables." +related: + - docs: /docs/organizing/floors/ + title: Floors + - docs: /docs/organizing/labels/ + title: Labels + - docs: /docs/organizing/areas/ + title: Areas + - docs: /docs/organizing/categories/ + title: Categories + - docs: /docs/organizing/ + title: Grouping your assets + - docs: /common-tasks/general/ + title: Enabling or disabling entities and automations +--- + +When working with tables, you can select multiple items to apply an action. If you have [grouped](/docs/organizing/) items by assigning them to floors, areas, labels, or directories, you can also filter your data accordingly. + +## Selecting multiple items in a table + +1. In your table, select the Multiselect icon button. + + ![Screenshots point out the enable selection mode button in the toolbar of the tables in Home Assistant](/images/blog/2024-04/enable-selection-mode.png) + +2. In the list, select the items of interest. + + ![Selecting multiple elements in a list](/images/organizing/multiselect_01.png) + +3. You can now apply changes to all selected elements, such as [applying labels](/docs/organzing/labels/) or [enabling or disabling entities and automations](/common-tasks/general/). + +## Filtering items in a table + +You can filter a table so that only items matching certain criteria are shown. + +1. In the top left corner above the table, select the **Filters** button. + + ![Select the filter button](/images/organizing/filters_01.png) + +2. In the filters panel, select your filter criteria. + - You can filter for [floors](/docs/organizing/floors/), [areas](/docs/organizing/areas/), [labels](/docs/organizing/labels/), and [categories](/docs/organizing/categories/) if you have previously defined them. + - The list of available criteria depends on the type of table. + + ![Screenshots showing the filter panel that tables can have, allowing you to easily find what you are looking for](/images/organizing/filter-panel.png) + +## Grouping and sorting items in a table + +You can group items in a table according to certain criteria. The number of shown items stays the same. No items will be hidden. + +1. In the top right above the table, select the **Group by** button. +2. The items will be grouped according to the criteria you chose. + - The list of available criteria depends on the type of table. + - The example shows a list of devices, grouped by manufacturer. + - In contrast, the entities table does not allow grouping by manufacturer, but by entity domains. + + ![Select the Group by button](/images/organizing/table_group_01.png) + +3. To sort the items, select the **Sort by** button. +4. To get a better overview, you can collapse groups in the list. + + ![Collapse groups](/images/organizing/table_group_collapse.png) \ No newline at end of file diff --git a/source/_docs/organizing/floors.markdown b/source/_docs/organizing/floors.markdown new file mode 100644 index 00000000000..3a39c03ec91 --- /dev/null +++ b/source/_docs/organizing/floors.markdown @@ -0,0 +1,50 @@ +--- +title: "Floors" +description: "Group your areas per floor" +related: + - docs: /docs/organizing/areas/ + title: Areas + - docs: /docs/organizing/ + - docs: /docs/organizing/labels/ + title: Labels + - docs: /docs/configuration/templating/#floors + title: Using floors in templates + - docs: /voice_control/aliases/ + title: Using floor alias for voice assistants +--- + +A floor in Home Assistant is a logical grouping of areas meant to match your home's physical floors. Devices and entities +cannot be assigned to floors directly but to areas. Floors can be used in automations and scripts as a target for actions. For example, to turn off all the lights on the downstairs floor when you go to bed. + +## Creating a floor + +Follow these steps to create a new floor. + +1. Go to {% my areas title="**Settings** > **Areas, labels & zones**" %} and select **Create floor**. +2. In the dialog, enter the floor details: + - Give the floor a **Name** (required). + - Add a floor **Level**. + - The number can be negative. For example for underground floors. + - This number can later be used for sorting. + - Add an icon (We use [Material icons](https://pictogrammers.com/library/mdi/)). + - Add an **Alias**. + - Aliases are alternative names used in [voice assistants](/voice_control/aliases/) to refer to an entity, area, or floor. + + ![Create floor dialog](/images/organizing/create_floor_01.png) +3. Select **Add**. + + **Result**: A new floor is created. + + ![Create floor dialog](/images/organizing/create_floor_02.png) +4. You can now [assign areas to that floor](/docs/organizing/areas/#assigning-areas-to-floors-and-add-labels). + +## Deleting a floor + +Follow these steps to delete a floor. Areas that are assigned to a floor will become unassigned. Automations and scripts or voice assistants that used a floor as a target will no longer work as they no longer have a target. + +1. Go to {% my areas title="**Settings** > **Areas, labels & zones**" %}. +2. Next to the floor, select the three dots menu and select **Delete floor**. + + ![Screenshot showing the dialog to delete a floor](/images/organizing/floor_delete.png) + +3. If you have automations, scripts, or voice assistants that used floors as a target, you will need to update these. diff --git a/source/_docs/organizing/labels.markdown b/source/_docs/organizing/labels.markdown new file mode 100644 index 00000000000..0e95e8dc515 --- /dev/null +++ b/source/_docs/organizing/labels.markdown @@ -0,0 +1,73 @@ +--- +title: "Labels" +description: "Label your areas, devices, entities, automations, scripts, and helpers. Then, filter by label or run an automation on all entities with that label." +related: + - docs: /docs/organizing/areas/ + title: Areas + - docs: /docs/organizing/floors/ + title: Floors + - docs: /docs/organizing/categories/ + title: Categories + - docs: /docs/configuration/templating/#labels + title: Using labels in templates +--- + +Labels in Home Assistant allow grouping elements irrespective of their physical location or type. Labels can be assigned to areas, devices, entities, automations, scenes, scripts, and helpers. Labels can be used in automations and scripts as a target for actions and services. Labels can also be used to filter data. For example, you can filter the list of devices to show only devices with the label `heavy energy usage` or turn these devices off when there is not a lot of solar energy available. + +## Creating a label + +Follow these steps to create a new label from the **Labels** view. + +1. Go to {% my labels title="**Settings** > **Areas, labels & zones**" %} and on top, select the **Labels** tab. +2. Select the **Create label** button. +3. In the dialog, enter the label details: + - Give the label a **Name** (required). + - Add an icon (We use [Material icons](https://pictogrammers.com/library/mdi/)). + - Add a **Color**. + + ![Create label dialog](/images/organizing/create_label_01.png) +4. Select **Create**. + + **Result**: A new label is created. + +## Applying labels + +Follow these steps to apply a label + +1. To apply a label to an area: + - Go to {% my areas title="**Settings** > **Areas, labels & zones**" %}. + - On the area card, select the pencil icon. + - Select one or more labels or select **Add new label** to create a new one. +2. To apply a label to a device, entity, or helper: + - Go to **{% my integrations title="Settings > Devices & Services" %}** and open the respective tab. + - Select the Multiselect icon button. + - From the list, select all the list entries to which you want to apply a label. + - In the top right corner, select **Add label**. Then, select the labels from the list. + + ![Apply label](/images/organizing/labels_add_05.png) +3. To apply a label to an automation, scene, or script: + - Go to {% my automations title="**Settings** > **Automations & Scenes**" %} and open the respective tab. + - Select the Multiselect icon button. + - From the list, select all the list entries to which you want to apply a label. + - In the top right corner, select the three dots menu, then select **Add label**. Then, select the labels from the list. + +## Deleting a label + +Follow these steps to delete a label. It will be removed from all the list entries it was applied to. +If you used this label in automations or script as targets, you need to adjust those. + +1. Go to {% my labels title="**Settings** > **Areas, labels & zones**" %} and on top, select the **Labels** tab. +2. In the list of labels, find the label you want to delete and select the three dots menu. +3. Select **Delete**. +4. If you used this label in automations or script as targets, you need to adjust those. + +## Removing labels + +1. Go to the data table that contains the element from which you want to remove the label: + - Go to **{% my integrations title="Settings > Devices & Services" %}** and open the respective tab. + - Or, go to {% my automations title="**Settings** > **Automations & Scenes**" %} and open the respective tab. +2. Select the Multiselect icon button. + - From the list, select all the items from which you want to remove a label. + - In the top right corner, select the three dots menu, then select **Add label**. + - Then, deselect the checkbox for the label you want to remove. + diff --git a/source/_docs/quality_scale.markdown b/source/_docs/quality_scale.markdown index 4f4b7dd3051..8803e2ce3ae 100644 --- a/source/_docs/quality_scale.markdown +++ b/source/_docs/quality_scale.markdown @@ -9,7 +9,7 @@ The Integration Quality Scale scores each integration based on the code quality ## No score -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 `configuration.yaml` file. +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. ## Silver 🥈 diff --git a/source/_docs/scripts.markdown b/source/_docs/scripts.markdown index a8988e68b8f..432a8d02b0b 100644 --- a/source/_docs/scripts.markdown +++ b/source/_docs/scripts.markdown @@ -7,11 +7,13 @@ no_toc: true Scripts are a sequence of {% term actions %} that Home Assistant will execute. Scripts are available as an entity through the standalone [Script integration] but can also be embedded in {% term automations %} and [Alexa/Amazon Echo] configurations. -When the script is executed within an automation the `trigger` variable is available. See [Available-Trigger-Data](/docs/automation/templating/#available-trigger-data). +When the script is executed within an {% term automation %}, the `trigger` variable is available. See [Available-Trigger-Data](/docs/automation/templating/#available-trigger-data). -The script syntax basic structure is a list of key/value maps that contain actions. If a script contains only 1 action, the wrapping list can be omitted. +## Script syntax -All actions support an optional `alias`. +The script syntax basic structure is a list of key/value maps that contain {% term actions %}. If a script contains only 1 {% term action %}, the wrapping list can be omitted. + +All {% term actions %} support an optional `alias`. ```yaml # Example script integration containing script syntax @@ -31,9 +33,9 @@ script: {{ page.content | markdownify | toc_only }} -## Call a Service +## Call a service -The most important one is the action to call a service. This can be done in various ways. For all the different possibilities, have a look at the [service calls page]. +The most important one is the action to call a {% term service %}. This can be done in various ways. For all the different possibilities, have a look at the [service calls page]. ```yaml - alias: "Bedroom lights on" @@ -44,9 +46,9 @@ The most important one is the action to call a service. This can be done in vari brightness: 100 ``` -### Activate a Scene +### Activate a scene -Scripts may also use a shortcut syntax for activating scenes instead of calling the `scene.turn_on` service. +Scripts may also use a shortcut syntax for activating {% term scenes %} instead of calling the `scene.turn_on` service. ```yaml - scene: scene.morning_living_room @@ -54,7 +56,7 @@ Scripts may also use a shortcut syntax for activating scenes instead of calling ## Variables -The variables action allows you to set/override variables that will be accessible by templates in actions after it. See also [script variables] for how to define variables accessible in the entire script. +The variables {% term action %} allows you to set/override variables that will be accessible by templates in {% term action %} after it. See also [script variables] for how to define variables accessible in the entire script. {% raw %} @@ -91,11 +93,11 @@ Variables can be templated. {% endraw %} -### Scope of Variables +### 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` action will only alter the `people` variable for that sequence. +Inside the `if` sequence the `variables` {% term action %} will only alter the `people` variable for that sequence. {% raw %} @@ -125,13 +127,13 @@ sequence: {% endraw %} -## Test a Condition +## Test a condition -While executing a script you can add a condition in the main sequence to stop further execution. When a condition does not return `true`, the script will stop executing. There are many different conditions which are documented at the [conditions page]. +While executing a script you can add a condition in the main sequence to stop further execution. When a condition does not return `true`, the script will stop executing. For documentation on the many different conditions refer to the [conditions page].
-The `condition` action only stops executing the current sequence block. When it is used inside a [repeat](#repeat-a-group-of-actions) action, only the current iteration of the `repeat` loop will stop. When it is used inside a [choose](#choose-a-group-of-actions) action, only the actions within that `choose` will stop. +The `condition` {% term action %} only stops executing the current sequence block. When it is used inside a [repeat](#repeat-a-group-of-actions) action, only the current iteration of the `repeat` loop will stop. When it is used inside a [choose](#choose-a-group-of-actions) action, only the {% term actions %} within that `choose` will stop.
@@ -184,6 +186,7 @@ Delays are useful for temporarily suspending your script and start it at a later ```yaml # Supports milliseconds, seconds, minutes, hours, days # Can be used in combination, at least one required +# When using milliseconds, consider that delay as *at least* X milliseconds. It won´t be exact. # Waits 1 minute - delay: minutes: 1 @@ -204,11 +207,11 @@ All forms accept templates. ## Wait -These actions allow a script to wait for entities in the system to be in a certain state as specified by a template, or some event to happen as expressed by one or more triggers. +These {% term actions %} allow a script to wait for entities in the system to be in a certain state as specified by a template, or some event to happen as expressed by one or more triggers. ### Wait for a template -This action evaluates the template, and if true, the script will continue. If not, then it will wait until it is true. +This {% term action %} evaluates the template, and if true, the script will continue. If not, then it will wait until it is true. 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. @@ -224,7 +227,7 @@ The template is re-evaluated whenever an entity ID that it references changes st ### Wait for a trigger -This action can use the same triggers that are available in an automation's `trigger` section. See [Automation Trigger](/docs/automation/trigger). The script will continue whenever any of the triggers fires. All previously defined [trigger variables](/docs/automation/trigger#trigger-variables), [variables](#variables) and [script variables] are passed to the trigger. +This {% term action %} can use the same triggers that are available in an automation's `trigger` section. See [Automation Trigger](/docs/automation/trigger). The script will continue whenever any of the triggers fires. All previously defined [trigger variables](/docs/automation/trigger#trigger-variables), [variables](#variables) and [script variables] are passed to the trigger. {% raw %} ```yaml @@ -324,9 +327,9 @@ This can be used to take different actions based on whether or not the condition ``` {% endraw %} -## Fire an Event +## Fire an event -This action allows you to fire an event. Events can be used for many things. It could trigger an automation or indicate to another integration that something is happening. For instance, in the below example it is used to create an entry in the logbook. +This {% term action %} allows you to fire an event. Events can be used for many things. It could trigger an {% term automation %} or indicate to another integration that something is happening. For instance, in the below example it is used to create an entry in the logbook. ```yaml - alias: "Fire LOGBOOK_ENTRY event" @@ -356,7 +359,7 @@ The `event_data` accepts templates. ### Raise and Consume Custom Events -The following automation example shows how to raise a custom event called `event_light_state_changed` with `entity_id` as the event data. The action part could be inside a script or an automation. +The following {% term automation %} example shows how to raise a custom event called `event_light_state_changed` with `entity_id` as the event data. The {% term action %} part could be inside a script or an {% term automation %}. ```yaml - alias: "Fire Event" @@ -370,7 +373,7 @@ The following automation example shows how to raise a custom event called `event state: "on" ``` -The following automation example shows how to capture the custom event `event_light_state_changed` with an [Event Automation Trigger](/docs/automation/trigger#event-trigger), and retrieve corresponding `entity_id` that was passed as the event trigger data, see [Available-Trigger-Data](/docs/automation/templating/#available-trigger-data) for more details. +The following {% term automation %} example shows how to capture the custom event `event_light_state_changed` with an [Event Automation Trigger](/docs/automation/trigger#event-trigger), and retrieve corresponding `entity_id` that was passed as the event trigger data, see [Available-Trigger-Data](/docs/automation/templating/#available-trigger-data) for more details. {% raw %} @@ -389,7 +392,7 @@ The following automation example shows how to capture the custom event `event_li ## Repeat a group of actions -This action allows you to repeat a sequence of other actions. Nesting is fully supported. +This {% term action %} allows you to repeat a sequence of other {% term actions %}. Nesting is fully supported. There are three ways to control how many times the sequence will be run. ### Counted repeat @@ -566,7 +569,7 @@ For example: ### Repeat loop variable -A variable named `repeat` is defined within the repeat action (i.e., it is available inside `sequence`, `while` & `until`.) +A variable named `repeat` is defined within the repeat {% term action %} (i.e., it is available inside `sequence`, `while` & `until`.) It contains the following fields: field | description @@ -577,7 +580,7 @@ field | description ## If-then -This action allow you to conditionally (`if`) run a sequence of actions (`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`). @@ -600,13 +603,13 @@ script: message: "Skipped cleaning, someone is home!" ``` -This action supports nesting, however, if you find yourself using nested if-then +This {% term action %} supports nesting, however, if you find yourself using nested if-then actions in the `else` part, you may want to consider using [choose](#choose-a-group-of-actions) instead. -## Choose a Group of Actions +## Choose a group of actions -This action allows you to select a sequence of other actions from a list of sequences. +This {% term action %} allows you to select a sequence of other {% term actions %} from a list of sequences. Nesting is fully supported. Each sequence is paired with a list of conditions. (See the [conditions page] for available options and how multiple conditions are handled.) The first sequence whose conditions are all true will be run. @@ -614,7 +617,7 @@ An _optional_ `default` sequence can be included which will be run only if none An _optional_ `alias` can be added to each of the sequences, excluding the `default` sequence. -The `choose` action can be used like an "if/then/elseif/then.../else" statement. The first `conditions`/`sequence` pair is like the "if/then", and can be used just by itself. Or additional pairs can be added, each of which is like an "elif/then". And lastly, a `default` can be added, which would be like the "else." +The `choose` {% term action %} can be used like an "if/then/elseif/then.../else" statement. The first `conditions`/`sequence` pair is like the "if/then", and can be used just by itself. Or additional pairs can be added, each of which is like an "elif/then". And lastly, a `default` can be added, which would be like the "else." {% raw %} @@ -696,7 +699,7 @@ automation: More `choose` can be used together. This is the case of an IF-IF. -The following example shows how a single automation can control entities that aren't related to each other but have in common the same trigger. +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. When the sun goes below the horizon, the `porch` and `garden` lights must turn on. If someone is watching the TV in the living room, there is a high chance that someone is in that room, therefore the living room lights have to turn on too. The same concept applies to the `studio` room. @@ -751,15 +754,57 @@ automation: {% endraw %} +## Grouping actions + +The `sequence` {% term action %} allows you to group multiple {% term actions %} +together. Each action will be executed in order, meaning the next action will +only be executed after the previous action has been completed. + +Grouping actions in a sequence can be useful when you want to be able to +collapse related groups in the user interface for organizational purposes. + +Combined with the [`parallel`](#parallelizing-actions) action, it can also be +used to run multiple groups of actions in a sequence in parallel. + +In the example below, two separate groups of actions are executed in sequence, +one for turning on devices, the other for sending notifications. Each group of +actions is executed in order, this includes the actions in each group and the +groups themselves. In total, four actions are executed, one after the other. + +```yaml +automation: + - trigger: + - platform: state + entity_id: binary_sensor.motion + to: "on" + action: + - alias: "Turn on devices" + sequence: + - service: light.turn_on + target: + entity_id: light.ceiling + - service: siren.turn_on + target: + entity_id: siren.noise_maker + - alias: "Send notifications" + sequence: + - service: notify.person1 + data: + message: "The motion sensor was triggered!" + - service: notify.person2 + data: + message: "Oh oh, someone triggered the motion sensor..." +``` + ## Parallelizing actions -By default, all sequences of actions in Home Assistant run sequentially. This -means the next action is started after the current action has been completed. +By default, all sequences of {% term actions %} in Home Assistant run sequentially. This +means the next {% term action %} is started after the current action has been completed. This is not always needed, for example, if the sequence of actions doesn't rely on each other and order doesn't matter. For those cases, the `parallel` action -can be used to run the actions in the sequence in parallel, meaning all -the actions are started at the same time. +can be used to run the {% term actions %} in the sequence in parallel, meaning all +the {% term actions %} are started at the same time. The following example shows sending messages out at the same time (in parallel): @@ -802,32 +847,32 @@ script:
-Running actions in parallel can be helpful in many cases, but use it with +Running {% term actions %} in parallel can be helpful in many cases, but use it with caution and only if you need it. There are some caveats (see below) when using parallel actions. While it sounds attractive to parallelize, most of the time, just the regular -sequential actions will work just fine. +sequential {% term actions %} will work just fine.
-Some of the caveats of running actions in parallel: +Some of the caveats of running {% term actions %} in parallel: -- There is no order guarantee. The actions will be started in parallel, but +- There is no order guarantee. The {% term actions %} will be started in parallel, but there is no guarantee that they will be completed in the same order. -- If one action fails or errors, the other actions will keep running until +- 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 action are not available - in another parallelized action. Each step in a parallelized has its own scope. +- 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. ## Stopping a script sequence It is possible to halt a script sequence at any point and return script responses -using the `stop` action. +using the `stop` {% term action %}. -The `stop` action takes a text as input explaining the reason for halting the -sequence. This text will be logged and shows up in the automations and +The `stop` {% term action %} takes a text as input explaining the reason for halting the +sequence. This text will be logged and shows up in the {% term automations %} and script traces. `stop` can be useful to halt a script halfway through a sequence when, @@ -847,7 +892,7 @@ response data must contains a mapping of key/value pairs. ``` There is also an `error` option, to indicate we are stopping because of -an unexpected error. It stops the sequence as well, but marks the automation +an unexpected error. It stops the sequence as well, but marks the {% term automation %} or script as failed to run. ```yaml @@ -857,20 +902,20 @@ or script as failed to run. ## Continuing on error -By default, a sequence of actions will be halted when one of the actions in -that sequence encounters an error. The automation or script will be halted, -an error is logged, and the automation or script run is marked as errored. +By default, a sequence of {% term actions %} will be halted when one of the {% term actions %} in +that sequence encounters an error. The {% term automation %} or script will be halted, +an error is logged, and the {% term automation %} or script run is marked as errored. Sometimes these errors are expected, for example, because you know the service you call can be problematic at times, and it doesn't matter if it fails. -You can set `continue_on_error` for those cases on such an action. +You can set `continue_on_error` for those cases on such an {% term action %}. -The `continue_on_error` is available on all actions and is set to -`false`. You can set it to `true` if you'd like to continue the action -sequence, regardless of whether that action encounters an error. +The `continue_on_error` is available on all {% term actions %} and is set to +`false`. You can set it to `true` if you'd like to continue the {% term action %} +sequence, regardless of whether that {% term action %} encounters an error. -The example below shows the `continue_on_error` set on the first action. If -it encounters an error; it will continue to the next action. +The example below shows the `continue_on_error` set on the first {% term action %}. If +it encounters an error; it will continue to the next {% term action %}. ```yaml - alias: "If this one fails..." @@ -891,8 +936,8 @@ or errors that Home Assistant does not handle. ## Disabling an action -Every individual action in a sequence can be disabled, without removing it. -To do so, add `enabled: false` to the action. For example: +Every individual {% term action %} in a sequence can be disabled, without removing it. +To do so, add `enabled: false` to the {% term action %}. For example: ```yaml # Example script with a disabled action @@ -914,6 +959,55 @@ script: entity_id: light.ceiling ``` +Actions can also be disabled based on limited templates or blueprint inputs. + +{% raw %} + +```yaml +blueprint: + input: + input_boolean: + name: Boolean + selector: + boolean: + + action: + - delay: 0:35 + enabled: !input input_boolean +``` + +{% endraw %} + +## Respond to a conversation + +The `set_conversation_response` script {% term action %} allows returning a custom response +when an {% term automation %} is triggered by a conversation engine, for example a voice +assistant. The conversation response can be templated. + +{% raw %} + +```yaml +# Example of a templated conversation response resulting in "Testing 123" +- variables: + my_var: "123" +- set_conversation_response: "{{ 'Testing ' + my_var }}": +``` + +{% endraw %} + +The response is handed to the conversation engine when the {% term automation %} finishes. If +the `set_conversation_response` is executed multiple times, the most recent +response will be handed to the conversation engine. To clear the response, set it +to `None`: + +```yaml +# Example of a clearing a conversation response +set_conversation_response: ~ +``` + +If the {% term automation %} was not triggered by a conversation engine, the response +will not be used by anything. + [Script integration]: /integrations/script/ [automations]: /docs/automation/action/ [Alexa/Amazon Echo]: /integrations/alexa/ diff --git a/source/_docs/scripts/conditions.markdown b/source/_docs/scripts/conditions.markdown index 71529b270f5..21f7c96694e 100644 --- a/source/_docs/scripts/conditions.markdown +++ b/source/_docs/scripts/conditions.markdown @@ -165,7 +165,7 @@ condition: ## Numeric state condition -This type of condition attempts to parse the state of the specified entity or the attribute of an entity as a number, and triggers if the value matches the thresholds. +This type of condition attempts to parse the state of the specified entity or the attribute of an entity as a number, and triggers if the value matches the thresholds (strictly below/above, so equal excluded). If both `below` and `above` are specified, both tests have to pass. @@ -218,8 +218,8 @@ condition: below: 25 ``` -Number helpers (`input_number` entities), `number` and `sensor` entities that -contain a numeric value, can be used in the `above` and `below` +Number helpers (`input_number` entities), `number`, `sensor`, and `zone` entities +that contain a numeric value, can be used in the `above` and `below` options to make the condition more dynamic. ```yaml @@ -711,3 +711,37 @@ condition: entity_id: sun.sun state: "above_horizon" ``` + +Conditions can also be disabled based on limited templates or blueprint inputs. + +{% raw %} + +```yaml +blueprint: + input: + input_boolean: + name: Boolean + selector: + boolean: + input_number: + name: Number + selector: + number: + min: 0 + max: 100 + + trigger_variables: + _enable_number: !input input_number + + condition: + - condition: state + entity_id: sun.sun + state: "above_horizon" + enabled: !input input_boolean + - condition: state + entity_id: sun.sun + state: "below_horizon" + enabled: "{{ _enable_number < 50 }}" +``` + +{% endraw %} diff --git a/source/_docs/scripts/service-calls.markdown b/source/_docs/scripts/service-calls.markdown index 03424e8a7d6..ccd734c536c 100644 --- a/source/_docs/scripts/service-calls.markdown +++ b/source/_docs/scripts/service-calls.markdown @@ -28,7 +28,7 @@ Instead of targeting an entity, you can also target an {% term area %} or {% ter This is done with the `target` key. A `target` is a map that contains at least one of the following: `area_id`, `device_id`, `entity_id`. -Each of these can be a list. +Each of these can be a list. The values should be lower-cased. The following example uses a single service call to turn on the lights in the living room area, 2 additional light devices and 2 additional light entities: @@ -80,7 +80,7 @@ entity_id: switch.ac ### Using the Services Developer Tool You can use the Services Developer Tool to test data to pass in a service call. -For example, you may test turning on or off a 'group' (See [groups] for more info) +For example, you may test turning on or off a 'group' (See [groups](/integrations/group/) for more info) To turn a group on or off, pass the following info: diff --git a/source/_docs/tools/check_config.markdown b/source/_docs/tools/check_config.markdown index 24592293913..d9b82771004 100644 --- a/source/_docs/tools/check_config.markdown +++ b/source/_docs/tools/check_config.markdown @@ -1,9 +1,12 @@ --- title: "check_config" description: "Script to perform a check of the current configuration" +related: + - docs: /docs/configuration/#validating-the-configuration + title: Validating the configuration --- -Test any changes to your `configuration.yaml` file before launching Home Assistant. This {% term script %} allows you to test changes without the need to restart Home Assistant. +Test any changes to your {% term "`configuration.yaml`" %} file before launching Home Assistant. This script allows you to test changes without the need to restart Home Assistant. ```bash hass --script check_config diff --git a/source/_docs/tools/dev-tools.markdown b/source/_docs/tools/dev-tools.markdown index 627fac764f4..bbece8757f5 100644 --- a/source/_docs/tools/dev-tools.markdown +++ b/source/_docs/tools/dev-tools.markdown @@ -10,8 +10,8 @@ The dashboard contains a section called **Developer tools**. Screenshot of Home Assistant's developer tools.

-| Section |Description | -| ---------- |---------------------------------------------------------------------| +| Section | Description | +| ---------- | ------------------------------------------------------------------- | | YAML | Lets you validate the configuration and trigger a reload or restart | | States | Sets the representation of an entity | | Services | Calls services from integrations | @@ -24,7 +24,27 @@ Screenshot of Home Assistant's developer tools. The Developer Tools is meant for **all** (not just for the developers) to quickly try out things - like calling services, updating states, raising events, and publishing messages in MQTT). It is also a necessary tool for those who write custom automations and scripts by hand. The following describes each of the sections in detail. -## States +## YAML tab + +The YAML tab provides buttons to trigger a check of configuration files and to reload the configuration. Reloading is needed to apply changes that you've made to the configuration. + +It is almost the same as the option under **Settings** > three dot menu (top right) > **Restart Home Assistant** > **Quick reload**. The only difference is that **Quick reload** reloads all the configuration, whereas this YAML tab allows you to only reload one specific configuration at a time. + +### Reloading the YAML configuration + +For configuration changes to become effective, the configuration must be reloaded. Most integrations in Home Assistant (that do not interact with {% term devices %} or {% term services %}) can reload changes made to their configuration in {% term "`configuration.yaml`" %} without needing to restart Home Assistant. + +1. Go to {% my server_controls title="**Developer Tools** > **YAML**" %} and scroll down to the YAML configuration reloading section (alternatively, hit ["c"](/docs/tools/quick-bar/) anywhere in the UI and search for "reload"). + - You are presented with a list of integrations, such as **Automations** or **Conversation**. + + ![Reload configuration changes](/images/docs/configuration/reloading_config.png) + +2. Depending on what you find in the list, you can proceed with either reloading or you need to restart Home Assistant: + - If the integration is listed, select it to reload the settings. + - For example, if you've changed the [General settings](/docs/configuration/basic/), you can select **Location & customizations** to apply those changes. + - If the integration is not listed, you need to **Restart** Home Assistant for changes to take effect. + +## States tab This section shows all the available entities, their corresponding state and the attribute values. The state and the attribute information is what Home Assistant sees at run time. To update the entity with a new state, or a new attribute value, click on the entity, scroll to the top, and modify the values, and click on “SET STATE” button. @@ -35,7 +55,7 @@ For example, changing the `light.bedroom` state from `off` to `on` does not turn The table containing all entities can be filtered for each column. The used search is a wildcard search meaning that if you input "office" in the entity column filter, every entity whose ID matches "\*office\*" will be shown. You can also add your own wildcards in the search input (e.g., "office\*light"). The attribute filter supports separate filters for attribute names and values, separated by a colon ":". So the filter "location:3" will result in the table showing all entities that have an attribute name that contains "location" and whose attribute value contains "3". -## Services +## Services tab This section is used to call Services that are available in the ServiceRegistry. @@ -48,6 +68,7 @@ A Service may also require additional input to be passed. It is commonly referre When an entity is selected from the Entity dropdown, it automatically populates service data with the corresponding `entity_id`. The service data YAML can then be modified to pass additional \[optional\] parameters. The following is an illustration on how to call a `light.turn_on` service. To turn on a light bulb, use the following steps: + 1. Select `light.turn_on` from the Service dropdown 2. Select the entity (typically the light bulb) from the Entity dropdown (if no entity_id is selected, it turns on ALL lights) 3. If an entity is selected, the service data is populated with basic YAML that will be passed to the service. Additional data can also be passed by updating the YAML as below. @@ -58,7 +79,7 @@ brightness: 255 rgb_color: [255, 0, 0] ``` -## Template editor +## Template editor tab The template editor provides a way to quickly test templates prior to placing them into automations and scripts. A code editor is on the left side and your real-time output is displayed in the preview on the right side. @@ -66,7 +87,7 @@ By default, this will contain sample code that illustrates how templates can be For more information about Jinja2, visit [Jinja2 documentation](https://jinja.palletsprojects.com/en/latest/templates/), and also read templating document [here](/docs/configuration/templating). -## Events +## Events tab In the Events section, you can either fire an event on the event bus or subscribe to an event type in order to view the event data JSON. @@ -118,7 +139,7 @@ Event 0 fired 9:53 AM: } ``` -## Statistics +## Statistics tab The **Statistics** tab shows a list of long-term statistic entities. If the long term statistics is not working for an entity, a **Fix Issue** link is shown. Select it to view a description of the issue. There might also be an option to fix the issue. @@ -130,15 +151,16 @@ icon. Use date & time to search for the incorrect data point and adjust the valu ![Screenshot showing adjusting the long-term statistic history value](/images/blog/2022-04/adjust-statistics.png) -## Assist +## Assist tab The **Assist** tab lets you see how Home Assistant's Assist processes a sentence. If no matching intent is found, then Assist is unable to interpret the sentence. If a matching intent was found, information is provided on the action that will be performed on which entities. The example below shows how the following sentence was parsed: *what lights are on in the office*. + - Assist found a matching intent: *HassGetState*. - It found entities matching the domain: *lights*. - The lights have the state *on*. -- The lights are in the area *office*. +- The lights are in the area *office*. - The targets are the narrowed-down entities in scope. ![Example use of assist developer tools](/images/docs/developer-tools/Assist.png) diff --git a/source/_docs/troubleshooting_general.markdown b/source/_docs/troubleshooting_general.markdown new file mode 100644 index 00000000000..46fb8379d41 --- /dev/null +++ b/source/_docs/troubleshooting_general.markdown @@ -0,0 +1,49 @@ +--- +title: "General troubleshooting" +description: "General troubleshooting information" +related: + - docs: /docs/configuration/#editing-configurationyaml + title: Editing your configuration + - docs: /integrations/recovery_mode/ + title: Recovery mode integration + - docs: /docs/locked_out/ + title: Resetting your password + - docs: /common-tasks/os/#home-assistant-via-the-command-line + title: Home Assistant via command line +--- + +This page provides some information about more generic troubleshooting topics. + +## Home Assistant went into recovery mode + +### Symptom: Home Assistant is in recovery mode + +On top of the page you see a red banner. On the **Overview** page, you see a **Recovery mode** notification. + +![image](/images/docs/troubleshooting/recovery_mode_active.png) + +### Description + +When Home Assistant is in recovery mode, there was an issue with the configuration. + +Recovery mode loads a minimum set of integrations to allow troubleshooting the configuration. Recovery mode will use the parts of the configuration that was used the last time Home Assistant started successfully. You can still see the user interface, the settings, and add-ons. + +### 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. + +- 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). + - In the Home Assistant user interface, open the add-on you usually use and edit the configuration file. +- Restart Home Assistant. +- If you are locked out because you forgot your password, you cannot edit the configuration file from the user interface. Follow the steps to [reset your password](/docs/locked_out/). + +## Restarting Home Assistant in safe mode + +If your Home Assistant is acting up and you cannot identify a root cause, you can use **Safe mode** to narrow down the number of possible causes. +**Safe mode** loads Home Assistant Core, but no custom integrations, no custom cards, and no custom themes. If the issue does not persist in **Safe mode**, the issue is not with Home Assistant Core. Before reporting an issue, check if the issue persists in **Safe mode**. + +- To enable Safe mode from the UI, go to **Settings** > **System** > **Restart Home Assistant** (top right) > **Restart Home Assistant in safe mode**. +- If you cannot reach the UI, you can enable **Safe mode** from the [command line](/common-tasks/os/#home-assistant-via-the-command-line): + - ```ha core restart --safe-mode``` + diff --git a/source/_docs/z-wave/controllers.markdown b/source/_docs/z-wave/controllers.markdown index 14b849223f5..0028c908338 100644 --- a/source/_docs/z-wave/controllers.markdown +++ b/source/_docs/z-wave/controllers.markdown @@ -22,6 +22,7 @@ Users should upgrade the firmware on all 700 series controllers to version 7.17. - 800 series controllers (with some caveats, see notes) - Zooz 800 Series Z-Wave Long Range S2 Stick (ZST39 LR) + - HomeSeer SmartStick G8 - 700 series controllers - Aeotec Z-Stick 7 USB stick (ZWA010) (the EU version is not recommended due to RF performance issues) @@ -66,12 +67,7 @@ The alternative to a stick is a hub that supports Z-Wave. Home Assistant support ### 800 Series Controllers -Z-Wave JS and Z-Wave JS UI do not support the following features available on most 800 series controllers. - -Unsupported: - - - Long Range - - NVM Backup/Restore +Z-Wave JS does not support Z-Wave Long Range yet. ### Aeotec Z-Stick @@ -85,9 +81,20 @@ It's totally normal for your Z-Wave stick to cycle through its LEDs (Yellow, Blu ### Razberry Board -You need to disable the on-board Bluetooth since the board requires the use of the hardware UART (and there's only one on the Pi3). You do this by adding the following to the end of `/boot/config.txt`: +On Raspberry Pi 3 and 4, you need to disable the on-board Bluetooth since the board requires the use of the hardware UART (whose pins are shared with the Bluetooth). You do this by adjusting the `/boot/config.txt`. -For both processes below you will need to insert your SD card into your PC and open the `/boot/config.txt` file with your favorite text editor. +For both processes below you will need to insert your SD card into your PC and open the configuration file with your favorite text editor. + +- If you are using {% term "Home Assistant Operating System" %}, once you mounted the disk, you will see the `config.txt` directly in the root directory. +- If you are using {% term "Home Assistant Supervised" %}, the config file is stored in the boot folder: `/boot/config.txt`. + +#### Raspberry Pi 5 procedure + +Add the following parameters to the bottom of the `config.txt` file. + +```text +dtoverlay=uart0 +``` #### Raspberry Pi 4 procedure diff --git a/source/_includes/asides/about.html b/source/_includes/asides/about.html index fa71c998e81..daf0a0ff121 100644 --- a/source/_includes/asides/about.html +++ b/source/_includes/asides/about.html @@ -8,6 +8,7 @@
  • Try the online demo
  • Join our newsletter
  • Follow Home Assistant on X
  • +
  • Home Assistant is part of the Open Home Foundation
  • {% comment %}
  • Subscribe to the Home Assistant Newsletter diff --git a/source/_includes/asides/component_navigation.html b/source/_includes/asides/component_navigation.html index 1d1b118210f..0d714b0628e 100644 --- a/source/_includes/asides/component_navigation.html +++ b/source/_includes/asides/component_navigation.html @@ -75,3 +75,39 @@
  • {%- endif -%} + +
    +
    +

    Code owners

    + {% if page.ha_codeowners %} + {% assign ha_project = false %} + {% for codeowner in page.ha_codeowners %} + {% if codeowner contains "@home-assistant/" %} + {% assign ha_project = true %} + {% endif %} + {% endfor %} + + {% if ha_project %} +
    + This integration is being maintained by the Home Assistant project. +
    + {% else %} +
    + We are incredibly grateful to the following contributors who currently maintain this integration:
    +
    +
    + {%- for codeowner in page.ha_codeowners -%} + {%- assign clean_codeowner = codeowner | replace: "@", "" -%} + {{ codeowner }}
    + {%- endfor -%} +
    + {% endif %} + {% else %} +
    + This integration is community maintained.
    + If you are a developer and would like to help, feel free to contribute! +
    + {% endif %} +
    +
    + diff --git a/source/_includes/asides/dashboards_navigation.html b/source/_includes/asides/dashboards_navigation.html index 016aacfaf61..e438544380c 100644 --- a/source/_includes/asides/dashboards_navigation.html +++ b/source/_includes/asides/dashboards_navigation.html @@ -6,7 +6,7 @@

    Projects

    diff --git a/source/_includes/common-tasks/backups.md b/source/_includes/common-tasks/backups.md index f6ed9efed9b..ca181c1c687 100644 --- a/source/_includes/common-tasks/backups.md +++ b/source/_includes/common-tasks/backups.md @@ -1,6 +1,8 @@ ## Backups -Backup of your Home Assistant and add-on data and configuration. They are stored in a compressed archive file (.tar). Backups are made from the backups panel under {% my supervisor_backups title="**Settings** > **System** > **Backups**" %}. There is also a service available that allows you to trigger the creation of a backup from an automation. By default, backups are stored locally in the `/backup` directory. +Backup of your Home Assistant, add-on data, and configuration. Backups are used to [restore](#restoring-a-backup) a system or parts of it if a rollback is needed or to migrate your Home Assistant to new hardware. It is good practice to create a backup before updating. + +Backups are made from the backups panel under {% my supervisor_backups title="**Settings** > **System** > **Backups**" %}. There is also a [service](/integrations/hassio/#service-hassiobackup_full) available that allows you to trigger the creation of a backup from an automation. Backups are stored in a compressed archive file (.tar) and by default, stored locally in the `/backup` directory. A full backup includes the following directories: @@ -26,7 +28,9 @@ A partial backup consists of any number of the above default directories and ins 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 or partial. +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. @@ -36,7 +40,7 @@ A partial backup consists of any number of the above default directories and ins 2. `ha backups restore slugname` - restores a specific backup 3. `ha backups new --name nameofbackup` - create a backup -Use `ha help` to get more information about the command line usage. +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). ### Copying your backups to another location @@ -44,7 +48,8 @@ You might need a backup in case your system has crashed. If you only store them There are multiple ways to store the backup on another device: -- **Option 1**: Under {% my supervisor_backups title="**Settings** > **System** > **Backups**" %}, select the backup from the list. +- **Option 1**: Under {% my supervisor_backups title="**Settings** > **System** > **Backups**" %}, on the list, single-click or tap the backup of interest. + - **Result**: The backup dialog opens. - In the dialog, select the three dots menu and select **Download backup**. - **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. @@ -54,7 +59,7 @@ There are multiple ways to store the backup on another device: - [Add a network storage location](/common-tasks/{{page.installation}}/#network-storage) for backups. - [Change the default location](/common-tasks/{{page.installation}}/#change-default-backup-location) for backups. -- **Option 4**: Or even better, create an automation to handle that. +- **Option 4**: Or even better, create an automation to handle that, using one of the [backup services](/integrations/hassio/#service-hassiobackup_full). - **Option 5**: Make use of a third-party add-on: - [Google Drive Backup](https://github.com/sabeechen/hassio-google-drive-backup) - [Dropbox Sync](https://github.com/danielwelch/hassio-dropbox-sync) diff --git a/source/_includes/common-tasks/beta_version.md b/source/_includes/common-tasks/beta_version.md index 651b2f33256..94ecdbff764 100644 --- a/source/_includes/common-tasks/beta_version.md +++ b/source/_includes/common-tasks/beta_version.md @@ -1,4 +1,4 @@ -## Run a beta version +### Running a beta version If you would like to test next release before anyone else, you can install the beta version. @@ -9,34 +9,34 @@ If you would like to test next release before anyone else, you can install the b - title: From the UI content: | - 1. In your Home Assistant UI navigate to {% my updates title="System > Updates" %} - 2. Click the overflow menu in the top right corner - 3. Click "Join beta" - 4. Navigate to Configuration panel - 5. Install the update that is presented to you + 1. In Home Assistant, go to {% my updates title="**System** > **Updates**" %}. + 2. In the top-right corner, select the three-dots menu. + 3. Select **Join beta**. + 4. Go to the {% my configuration title="**Configuration**" %} panel. + 5. Install the update that is presented to you. - title: From the CLI content: | - 1. Join the beta channel + 1. Join the beta channel. ```bash ha supervisor options --channel beta ``` - 2. Reload the supervisor + 2. Reload Home Assistant Supervisor. ```bash ha supervisor reload ``` - 3. Update Home Assistant core to the latest beta version + 3. Update Home Assistant Core to the latest beta version. ```bash ha core update --backup ``` - _The_ `--backup` _flag here ensures that you have a partial backup of your current setup incase you need to downgrade._ + _The_ `--backup` _flag here ensures that you have a partial backup of your current setup in case you need to downgrade._ {% endtabbed_block %} @@ -52,24 +52,24 @@ docker pull {{ site.installation.container }}:beta 1. Stop the Home Assistant service. -2. Switch to the user that is running Home Assistant +2. Switch to the user that is running Home Assistant. ```bash sudo -u homeassistant -H -s ``` -3. Activate the virtual environment that Home Assistant is running in +3. Activate the virtual environment that Home Assistant is running in. ```bash source /srv/homeassistant/bin/activate ``` -4. Download and install the beta version +4. Download and install the beta version. ```bash pip3 install --pre --upgrade homeassistant ``` -5. When that is complete start the service again for it to use the new files. +5. When that is complete, start the service again for it to use the new files. {% endif %} diff --git a/source/_includes/common-tasks/commandline.md b/source/_includes/common-tasks/commandline.md index 530ea7087d7..0c9980962b1 100644 --- a/source/_includes/common-tasks/commandline.md +++ b/source/_includes/common-tasks/commandline.md @@ -1,11 +1,6 @@ ## Home Assistant via the command line -

    - -Home Assistant upgrade process from the SSH command line -

    - -On the SSH command line, you can use the `ha` command to retrieve logs, check the details of connected hardware, and more. +On the [SSH command line](/common-tasks/os/#installing-and-using-the-ssh-add-on), you can use the `ha` command to retrieve logs, check the details of connected hardware, and more. ### Home Assistant @@ -16,6 +11,7 @@ ha core logs ha core options ha core rebuild ha core restart +ha core restart --safe-mode ha core start ha core stats ha core stop @@ -100,7 +96,25 @@ Use "ha [command] --help" for more information about a command. ``` {% if page.installation == "os" %} + ### Console access -You can also access the Home Assistant Operating System via a directly connected keyboard and monitor, the console. +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 + +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. + +The command `ha os datadisk wipe` marks the data partition (either internal on the eMMC or the SD card, or on an external attached data disk) as to be cleared on the next reboot. The command automatically reboots the system. Upon reboot, the data is cleared. Then the system continues to boot and reinstalls the latest version of all Home Assistant components. + +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/). + +#### Listing all users from the command line + +In {% term "Home Assistant Operating System" %}, the `ha auth list` command lists all users that are registered on your Home Assistant. + +The `ha auth list` command can only be run from the local terminal. Connect a display and keyboard and use the terminal. + {% endif %} diff --git a/source/_includes/common-tasks/configuration_check.md b/source/_includes/common-tasks/configuration_check.md index cc68d407518..6341f9ba446 100644 --- a/source/_includes/common-tasks/configuration_check.md +++ b/source/_includes/common-tasks/configuration_check.md @@ -2,12 +2,28 @@ {% if page.installation == "os" or page.installation == "supervised" %} +After changing configuration or automation files, check if the configuration is valid before restarting Home Assistant Core. + +### Running a configuration check from the UI + +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. +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. + ```bash ha core check ``` {% elsif page.installation == "container" %} +After changing configuration files, check if the configuration is valid before restarting Home Assistant Core. + _If your container name is something other than `homeassistant`, change that part in the examples below._ Run the full check: @@ -42,19 +58,21 @@ docker exec homeassistant python -m homeassistant --script check_config --help {% elsif page.installation == "core" %} -1. Switch to the user that is running Home Assistant +After changing configuration files, check if the configuration is valid before restarting Home Assistant Core. + +1. Switch to the user that is running Home Assistant. ```bash sudo -u homeassistant -H -s ``` -2. Activate the virtual environment that Home Assistant is running in +2. Activate the virtual environment that Home Assistant is running in. ```bash source /srv/homeassistant/bin/activate ``` -3. Run the configuration check +3. Run the configuration check. Run the full check: @@ -86,6 +104,6 @@ docker exec homeassistant python -m homeassistant --script check_config --help hass --script check_config --help ``` -4. When that is complete restart the service for it to use the new files. +4. When that is complete, restart the service for it to use the new files. {% endif %} diff --git a/source/_includes/common-tasks/data_disk.md b/source/_includes/common-tasks/data_disk.md index 33cd7dddd03..3202dfa86a2 100644 --- a/source/_includes/common-tasks/data_disk.md +++ b/source/_includes/common-tasks/data_disk.md @@ -1,6 +1,6 @@ -## Using external Data Disk +## Using external data disk -Home Assistant Operating System supports storing most data on an external storage medium (e.g. USB attached SSD or HDD). This data disk contains not only user data but also most of the Home Assistant software as well (Core, Supervisor etc.). This means a fast data disk will make the system overall much faster. +{% term "Home Assistant Operating System" %} supports storing most data on an external storage medium, such as an USB attached SSD or HDD. This data disk contains not only user data but also most of the Home Assistant software as well (Core, Supervisor, etc.). This means a fast data disk will make the system overall much faster. ![Graphics showing the architecture of the data disk feature](/images/haos/usb-data-disk.png) @@ -20,7 +20,7 @@ The data disk feature can be used on an existing installation without losing dat
    - If you have been using a data disk previously with Home Assistant Operating System, you need to use your host computer to delete all partitions *before* using it as a data disk again. + If you have been using a data disk previously with {% term "Home Assistant Operating System" %}, you need to use your host computer to delete all partitions *before* using it as a data disk again.
    @@ -28,7 +28,7 @@ The data disk feature can be used on an existing installation without losing dat 1. Connect the data disk to your system. 2. Go to **{% my storage title="Settings > System > Storage" %}** in the UI. -3. Select the "Move data disk" button. +3. Select **Move data disk**. 4. Select the data disk from the list of available devices. 5. Select **Move**. @@ -64,3 +64,41 @@ The system will prepare the data disk and immediately reboot. The reboot will ta Using an USB attached SSD can draw quite some power. For instance on Raspberry Pi 3 the official Raspberry Pi power supply (PSU) only provides 2.5A which can be too tight. Use a more powerful power supply if you experience issues. Alternatively use a powered USB hub. Connect the Hub to one of the USB slots of your Raspberry Pi, and connect the SSD to the Hub. In this setup the power supply of the Hub will power the attached device(s).
    + +### Migrating an external data disk to another system + +This section shows how to move an external data disk from one system to another. +This can be an option if the following elements apply to your use case: + +- You already have a functioning Home Assistant instance (system 1) that is using an external data disk. +- You have another, new, Home Assistant instance (system 2). +- You want now want to use the data disk of system 1 on system 2 instead. + +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. + +#### Prerequisites + +- A Home Assistant instance using an external data disk (system 1) +- A Home Assistant instance to which you want to move the external data disk (system 2) + +#### To migrate an external data disk to another system + +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). +2. Shut down system 1 and remove the data disk. +3. Make sure system 2 has Home Assistant OS installed, and Home Assistant is up and running. Home Assistant is using the data disk (partition) on the boot drive (e.g. SD card) at this point. +4. Make sure system 2 has completed the basic [onboarding](/getting-started/onboarding/) steps, including the last steps where devices are discovered automatically. +5. Plug the external disk into system 2 and go to the **Settings** > **System**. Select the three dots menu, and **Restart Home Assistant** > **Reboot system**. + **Result**: A repair issue is displayed **Multiple data disks detected**. + - The repair issue comes up because system 2 now sees two file systems with an identical name. During a reboot, there is a name conflict with the existing data disk as it is undefined which file system should be used. This can lead to a random selection of the system you end up with. Hence you must make a decision. +6. Open the repair issue and choose one of the options: + - Select **Use the detected data disk instead of the current system**. + - This will override the current file system of system 2 and use your external data disk instead. + - You won't have access anymore to the current Home Assistant data. It will be marked as inactive data disk. + - If you changed your mind about using the external data disk: + - Unplug the external data disk. + - If you cannot unplug the external data disk for some reason, select **Mark as inactive data disk (rename file system)**. + - This makes sure that there is no name conflict after rebooting. + - It also means you cannot use the file system that is stored on your external disk. + - You keep using the current file system of system 1. diff --git a/source/_includes/common-tasks/define_custom_polling.md b/source/_includes/common-tasks/define_custom_polling.md index bfa61648392..13b3e15f2d6 100644 --- a/source/_includes/common-tasks/define_custom_polling.md +++ b/source/_includes/common-tasks/define_custom_polling.md @@ -1,6 +1,8 @@ -If you want to define a specific interval at which your device is being polled for data, you can disable the default polling interval and create your own polling service. +If you want to define a specific interval at which your device is being polled for data, you can disable the default polling interval and create your own polling automation. + +To add the automation: 1. Go to {% my integrations title="**Settings** > **Devices & Services**" %}, and select your integration. 2. On the integration entry, select the three dots. diff --git a/source/_includes/common-tasks/development_version.md b/source/_includes/common-tasks/development_version.md index 98483671822..712bfef200b 100644 --- a/source/_includes/common-tasks/development_version.md +++ b/source/_includes/common-tasks/development_version.md @@ -1,4 +1,4 @@ -## Run a development version +### Running a development version If you want to stay on the bleeding-edge Home Assistant Core development branch, you can upgrade to `dev`. @@ -10,19 +10,19 @@ If you want to stay on the bleeding-edge Home Assistant Core development branch, {% if page.installation == "os" or page.installation == "supervised" %} -1. Join the dev channel +1. Join the dev channel. ```bash ha supervisor options --channel dev ``` -2. Reload the supervisor +2. Reload the {% term "Home Assistant Supervisor" %}. ```bash ha supervisor reload ``` -3. Update Home Assistant core to the latest dev version +3. Update {% term "Home Assistant Core" %} to the latest dev version. ```bash ha core update --backup @@ -42,24 +42,24 @@ docker pull {{ site.installation.container }}:dev 1. Stop the Home Assistant service. -2. Switch to the user that is running Home Assistant +2. Switch to the user that is running Home Assistant. ```bash sudo -u homeassistant -H -s ``` -3. Activate the virtual environment that Home Assistant is running in +3. Activate the virtual environment that Home Assistant is running in. ```bash source /srv/homeassistant/bin/activate ``` -4. Download and install the version you want +4. Download and install the version you want. ```bash pip3 install --upgrade git+https://github.com/home-assistant/core.git@dev ``` -5. When that is complete start the service again for it to use the new files. +5. When that is complete, start the service again for it to use the new files. {% endif %} diff --git a/source/_includes/common-tasks/enable_entities.md b/source/_includes/common-tasks/enable_entities.md index 25981da8629..4b05c795dd7 100644 --- a/source/_includes/common-tasks/enable_entities.md +++ b/source/_includes/common-tasks/enable_entities.md @@ -1,12 +1,17 @@ -## Enabling entities +## Enabling or disabling elements Some entities are disabled by default. To enable them, follow these steps: -1. Go to **{% my integrations title="Settings > Devices & Services" %}** and select the integration of interest. -2. Select **entities**. -3. From the list of entities, select the entity you want to enable. - ![Select entity from list](/images/screenshots/enable_entities_01.png) -4. In the pop-up, select the cogwheel. -5. Toggle the **Enabled** button. - ![Enable entities](/images/screenshots/enable_entities_03.png) -6. To save the changes, select **Update**. +1. In Home Assistant, open the table of interest. + - To enable or disable entities, go to {% my entities title="**Settings** > **Devices & Services** > **Entities**" %}. + - To enable or disable automations, go to {% my automations title="**Settings** > **Automations & Scenes**" %}. +2. [Enable multiselect](/docs/organizing/filtering) and select all the entities you want to enable or disable. +3. In the top right corner, select the three dots menu, then select **Enable** or **Disable**. + + ![Screenshot showing how to enable or disable multiple automations](/images/organizing/enable_disable.png) + +## Related topics + +- [Enable multiselect](/docs/organizing/filtering) +- [Grouping your assets](/docs/organizing/) +- [Filtering your assets](/docs/organizing/filtering) diff --git a/source/_includes/common-tasks/enable_i2c.md b/source/_includes/common-tasks/enable_i2c.md index 27877fd75f6..8e89d4b89cd 100644 --- a/source/_includes/common-tasks/enable_i2c.md +++ b/source/_includes/common-tasks/enable_i2c.md @@ -1,6 +1,6 @@ ## Enable I2C -Home Assistant using the Home Assistant Operating System which is a managed environment, which means you can't use existing methods to enable the I2C bus on a Raspberry Pi. In order to use I2C devices you will have to +Home Assistant using the {% term "Home Assistant Operating System" %} which is a managed environment, which means you can't use existing methods to enable the I2C bus on a Raspberry Pi. In order to use I2C devices you will have to - Enable I2C for the Home Assistant Operating System - Setup I2C devices e.g. sensors @@ -10,7 +10,7 @@ Home Assistant using the Home Assistant Operating System which is a managed envi You will need: - SD card reader -- SD card with Home Assistant Operating System flashed on it +- SD card with {% term "Home Assistant Operating System" %} flashed on it Shutdown/turn-off your Home Assistant installation and unplug the SD card. Plug the SD card into an SD card reader and find a drive/file system named @@ -43,7 +43,7 @@ and make sure the first partition is available. ### Enable I2C via Home Assistant Operating System Terminal -Alternatively, by attaching a keyboard and screen to your device, you can access the physical terminal to the Home Assistant Operating System. +Alternatively, by attaching a keyboard and screen to your device, you can access the physical terminal to the {% term "Home Assistant Operating System" %}. You can enable I2C via this terminal: diff --git a/source/_includes/common-tasks/file_access.md b/source/_includes/common-tasks/file_access.md index f7a3e7f464c..2834b39d45a 100644 --- a/source/_includes/common-tasks/file_access.md +++ b/source/_includes/common-tasks/file_access.md @@ -4,7 +4,7 @@ Your Home Assistant Operating server includes two repositories by default: The o One of the first things to take care of after installing Home Assistant OS is to provide yourself access to files. There are several add-ons commonly used for this, and most users employ a mix of various add-ons. Default directories on the host are mapped to the add-ons so that they can be accessed by the services any particular add-on might provide. On the host system these directories exist on the `/data` partition at `/mnt/data/supervisor/`. -Using any of the add-ons listed below,the following directories are made available for access: +Using any of the add-ons listed below, the following directories are made available for access: - `addons` - `backup` @@ -17,44 +17,98 @@ Using any of the add-ons listed below,the following directories are made availab ### Installing and using the Samba add-on -The Samba add-on creates smb shares which can be accessed from another computer. You can also edit files using the editor of your preference from your client computer. This add-on can be installed from the add-on store's official repository. +The **Samba** add-on allows you to share the directories on Home Assistant with other systems on your network. After installing the add-on, you can then also edit files using the editor of your preference from your client computer. This add-on can be installed from the add-on store's official repository. -To configure the Samba add-on, you only need to set a user and password of your choice on the configuration page, save, and then start the add-on. The add-on will not start without setting a password! +To install the add-on, follow these steps: -To connect to the Samba server from another device, you will use the IP address or hostname of your server. Either of these can be found on the {% my network title="Settings > System > Network" %} page of your UI. +1. Go to {% my supervisor_addon title="**Settings** > **Add-ons** > **Samba share**" addon="core_samba" %} and select **Install**. +2. On the **Configuration** tab, define **Username** and **Password**, store them in a safe place, and save your changes. + - You can specify any username and password. + - They are not related to the login credentials you use to log in to Home Assistant or to log in to the computer from which you are accessing the files. + - The add-on won't start if username and password are not defined. +3. For further configuration information, refer to the **Documentation** tab. +4. To start the add-on, on the **Information** tab, select **Start**. -For connecting from Windows 10, you can enter the IP address or hostname in File Explorer's address bar with two backslashes, as shown in the example screenshot. +To access the Home Assistant directories from the other device, follow these steps: - +1. Go to {% my network title="**Settings** > **System** > **Network**" %} and take note of the **Host name**. + - Alternatively, you can look up the host name or IP address of your Home Assistant on your router. +2. How you connect from another device to Home Assistant depends on your system. Use one of the following options: + - **On Windows**: Open **File Explorer** and in the address bar, enter the IP address or hostname with two backslashes as `\\your.ha.ip.address` or `\\hostname`. -You should then be prompted for the credentials you entered in the Samba add-on configuration. You also have the option of having the credentials stored so that you do not need to enter them again. After that, you'll have access to the directories which you can then mount as a drive or pin to Quick Access. +

    + Screenshot of File Explorer displaying the navigation to a file share using an IP address + Screenshot of File Explorer displaying the navigation to a file share using an IP address +

    + - **On OS X**: Open **Finder** and select **Go** > **Connect to Server...** and enter the IP address or hostname as `smb://your.ha.ip.address` or `smb://hostname`. + - **On Ubuntu**: Open **Files** and in the address bar, enter the IP address or hostname as `smb://your.ha.ip.address` or `smb://hostname`. -For OS X, connecting to the shares is a matter of using the Finder menu > Go > Connect to Server... -You would then enter the IP address or hostname of your Home Assistant OS instance as `smb://your.ha.ip.address` or `smb://homeassistant` and enter your credentials when prompted. - ---- - -### Installing and using the SSH add-on (requires enabling advanced mode for the HA user) - -The Terminal & SSH add-on provides access over an SSH connection, and also includes nano and vi editors. It can be installed from the add-on store's Official add-on repository after enabling advanced mode for your Home Assistant user's profile. Additionally, this add-on provides access to the Home Assistant Command Line Interface (CLI) which provides custom commands for checking logs, stopping and starting Home Assistant and add-ons, creating/restoring backups, and more. (See [Home Assistant via Command Line](https://www.home-assistant.io/hassio/commandline/) for further info). The Terminal & SSH add-on does *not* provide access to the underlying host file system. - -To use the add-on, enter a password or public key on its configuration page, then save and start the add-on. - -The Terminal & SSH add-on also provides a web terminal which allows you to access a terminal via the Home Assistant user interface. In order to access from an ssh client, a port needs to be entered in the network section of the add-on's configuration page. +3. Enter the credentials you entered in the **Samba** add-on configuration. + - You also have the option of having the credentials stored so that you do not need to enter them again. +4. Done! You now have access to the directories which you can then mount as a drive or pin to Quick Access. --- ### Installing and using the Visual Studio Code (VSC) add-on -The Visual Studio Code add-on provides access through a feature packed web-based version of the Visual Studio Code editor and currently only supports AMD64 and aarch64/ARM64 machines. This add-on can be installed in the add-on store from the Community add-on repository. The add-on also provides access to the Home Assistant Command Line Interface (CLI) using VSC's built in terminal, which allows for checking logs, stopping and starting Home Assistant and add-ons, creating/restoring backups, and more. (See [Home Assistant via Command Line](https://www.home-assistant.io/hassio/commandline/) for further info). +The **Studio Code Server** add-on provides access through a feature-packed web-based version of the Visual Studio Code editor. It currently only supports AMD64 and aarch64/ARM64 machines. The add-on also provides access to the Home Assistant Command Line Interface (CLI) using VSC's built-in terminal, which allows for checking logs, stopping, and starting Home Assistant and add-ons, creating/restoring backups, and more. (See [Home Assistant via Command Line](/hassio/commandline/) for further info). -There is no configuration required for editing files within your `/config` directory. In order to enable access to other directories, it is necessary to edit the add-on's configuration from its configuration tab. See the add-on documentation for details. +

    +Screenshot of an example of a configuration.yaml file, accessed using the File editor add-on on a Home Assistant Operating System installation. +Example of a configuration.yaml file, accessed using the Studio Code Server add-on on a Home Assistant Operating System installation. +

    + +To install and use the **Studio Code Server** in Home Assistant, follow these steps: + +1. To install the add-on, go to {% my supervisor_addon title="**Settings** > **Add-ons** > **Studio Code Server**" addon="a0d7b954_vscode" %} and install the add-on. +2. Once you have the add-on installed, if you want, select the **Show in sidebar** option. Then, select **Start**. +3. For information on configuration settings, open the **Documentation** tab. +4. To start browsing, on the **Info** tab, select **Open Web UI**. --- ### Installing and using the File Editor add-on -A more basic and light weight alternative to Visual Studio Code, the File Editor add-on provides access through Hass-Configurator, which is a web-based filesystem-browser and text-editor. YAML files are automatically checked for syntax errors while editing. This add-on can be installed via the add-on store from the official add-on repository. +The **File Editor** add-on is a web-based file system browser and text editor. It is a more basic and light weight alternative to Visual Studio Code. YAML files are automatically checked for syntax errors while editing. -There is no configuration required for editing files within your `/config` directory. In order to enable access to further directories, editing the add-on configuration is required. See the add-on documentation for details. +

    +Screenshot of an example of a configuration.yaml file, accessed using the File editor add-on on a Home Assistant Operating System installation. +Example of a configuration.yaml file, accessed using the File editor add-on on a Home Assistant Operating System installation. +

    + +To install and use the File Editor in Home Assistant, follow these steps: + +1. To install the add-on, go to {% my supervisor_addon title="**Settings** > **Add-ons** > **File editor**" addon="core_configurator" %}. + - Once you have the add-on installed, you can edit files within your `/config` directory. +2. If you want to be able to access directories outside the `/config` directory, in the add-on, open the **Configuration** tab and disable the **Enforce basepath** option. + - Note: The **Enforce basepath** option is intended to protect you from inadvertently making changes to settings files. +3. For information on other configuration settings, open the **Documentation** tab. +4. To confirm your changes, select **Save**. +5. To start browsing, on the **Info** tab, select **Open Web UI**. + +--- + +### Installing and using the SSH add-on + +If you want to use the Home Assistant command line or an SSH client, you can do this through the **Terminal & SSH** add-on. + +The **Terminal & SSH** add-on provides the following functionalities: + +- It provides a web terminal that you can access from the Home Assistant user interface. +- It allows you to use the Home Assistant Command Line Interface (CLI) which provides custom commands for checking logs, stopping and starting Home Assistant and add-ons, creating/restoring backups, and more. + - For a list of command line commands, refer to [Home Assistant via Command Line](/common-tasks/os#home-assistant-via-the-command-line). +- It allows connecting to your system using an SSH client. +- It also includes common tools like nano and vi editors. +- The Terminal & SSH add-on does **not provide** access to the underlying host file system. + +To get started with the **Terminal & SSH** add-on, follow these steps: + +1. In the bottom left, select your user to open the {% my profile title="**Profile**" %} page. Make sure **Advanced Mode** is enabled. +2. To install the add-on, go to the add-on store under [**Settings** > **Add-ons**](https://my.home-assistant.io/redirect/supervisor_addon/?addon=core_ssh) and install the **Terminal & SSH** add-on. +3. To use the web terminal, **start** the add-on, then select **Open Web UI**. + - You can now start typing your [commands](/common-tasks/os#home-assistant-via-the-command-line). +4. If you want to access from an ssh client, you need to enter credentials: + - Open the **Configuration** page. + - Enter a password or authorized Keys. + - Then save and start the add-on. diff --git a/source/_includes/common-tasks/filters.md b/source/_includes/common-tasks/filters.md index 9533bbc03cf..aed41f62775 100644 --- a/source/_includes/common-tasks/filters.md +++ b/source/_includes/common-tasks/filters.md @@ -32,4 +32,4 @@ Filters are applied as follows: The following characters can be used in entity globs: `*` - The asterisk represents zero, one, or multiple characters -`?` - The question mark represents a single character +`?` - The question mark represents zero or one character diff --git a/source/_includes/common-tasks/flashing_m1s_otg.md b/source/_includes/common-tasks/flashing_m1s_otg.md new file mode 100644 index 00000000000..abefeba173b --- /dev/null +++ b/source/_includes/common-tasks/flashing_m1s_otg.md @@ -0,0 +1,47 @@ +## Flashing an ODROID-M1S + +Home Assistant can be flashed to an ODROID-M1S by connecting the device directly to your computer via the USB-OTG connection on the front of the board. +Unlike other ODROID boards, the M1S does not have a socket for an optional eMMC module. It also does not have a separate flash chip that holds a dedicated bootloader. +Instead, the M1S has a build-in 64GB eMMC soldered directly on the board that holds a bootloader by default. This guide will show you how to install the {% term "Home Assistant Operating System" %} to the built-in eMMC. + +**Warning: Installing Home Assistant OS replaces the firmware and SPL on the eMMC with the mainline version provided by the Home Assistant OS. As a result, it is not possible to use the SD card with the EMMC2UMS image anymore, because the mainline SPL is not compatible with U-Boot in the EMMC2UMS image at this time (February 2024). This does not pose any problem for standard use, just makes it more complicated in case you want to return to the Hardkernel-provided OS (see [HK Recovery](#hk-recovery)).** + +### What you will need + +To flash your eMMC using USB-OTG, you will need the following items: + +- A small SD card +- Another computer +- USB 2.0 to micro-USB cable +- the special Hardkernel eMMC-to-USB-mass-storage image + +### Boot into mass-storage mode + +(These steps are identical to the official [Hardkernel wiki](https://wiki.odroid.com/odroid-m1s/getting_started/os_installation_guide?redirect=1#install_over_usb_from_pc) page.) + +1. Download [ODROID-M1S_EMMC2UMS.img](https://dn.odroid.com/RK3566/ODROID-M1S/Installer/ODROID-M1S_EMMC2UMS.img). +2. Use [balena Etcher](https://www.balena.io/etcher/) or another tool to flash the UMS utility onto an SD card. + - Use **Flash from file**. **Flash from URL** does not work on all systems. + (balena Etcher will complain that something went wrong during flashing. You can ignore this message) +3. Plug-in that SD card to your ODROID-M1S and boot it. + +### Flashing Home Assistant M1S + +1. Download the latest stable version of Home Assistant OS for the [ODROID-M1S](https://github.com/home-assistant/operating-system/releases/download/{{site.data.version_data.hassos['odroid-m1s']}}/haos_odroid-m1s-{{site.data.version_data.hassos['odroid-m1s']}}.img.xz). +2. Apart from the HAOS image to flash (M1S instead of N2+ version), you can follow the N2+ step-by-step flashing guide [HERE](/common-tasks/os/#flashing-home-assistant). + + +#### _HK Recovery_ + +If you want to restore your M1S back into Hardkernel's initial state, you will have to restore the HK's bootloader. +A reliable way of reflashing the eMMC with an operating system of your choice is to use Home Assistant OS to flash the EMMC2UMS image which turns the ODROID-M1S into USB Mass Storage device. Once you have flashed the EMMC2UMS image, you can flash any OS again. You will need a micro USB cable to connect ODROID-M1S to PC. + +Note: This commands will render your current Home Assistant OS installation unbootable! + +Use the local terminal (HDMI/keyboard) to access the system console. On the Home Assistant CLI (command line), enter `login` to enter the root shell and use `curl` to download an image and `dd` it to the eMMC block device: + +```sh +curl https://dn.odroid.com/RK3566/ODROID-M1S/Installer/ODROID-M1S_EMMC2UMS.img | dd of=/dev/mmcblk0 +``` + +This way, the device will start in the UMS mode on the next boot with the SD card removed. Follow the [Install over USB from PC](https://wiki.odroid.com/odroid-m1s/getting_started/os_installation_guide#install_over_usb_from_pc) to install a different operating system. diff --git a/source/_includes/common-tasks/flashing_n2_otg.md b/source/_includes/common-tasks/flashing_n2_otg.md index d6f46f80d00..8a53895d93e 100644 --- a/source/_includes/common-tasks/flashing_n2_otg.md +++ b/source/_includes/common-tasks/flashing_n2_otg.md @@ -72,9 +72,9 @@ This will configure the ODROID-N2+ and OTG to act as a memory card reader: - Make sure to toggle the boot mode switch back to MMC. 4. Put the ODROID back in its case. -5. Connect your ODROID-N2+ to your network with an Ethernet cable and plug in power. +5. Connect your ODROID-N2+ to your network with an Ethernet cable, make sure there is internet access, and plug in power. 6. If your router supports mDNS, you can reach your installation at `http://homeassistant.local:8123`. - - If your network doesn’t support mDNS, you’ll have to use the IP address of your ODROID-N2+ instead of `homeassistant.local`. For example, `http://192.168.0.9:8123`. + - If your network doesn’t support mDNS, you’ll have to use the IP address of your ODROID-N2+ instead of `homeassistant.local`. For example, `http://192.168.0.9:8123`. - You should be able to find the IP address of your ODROID-N2+ from the admin interface of your router. 7. Continue with [onboarding](/getting-started/onboarding/). \ No newline at end of file diff --git a/source/_includes/common-tasks/network_storage.md b/source/_includes/common-tasks/network_storage.md index 00cf377105e..540e8baa891 100644 --- a/source/_includes/common-tasks/network_storage.md +++ b/source/_includes/common-tasks/network_storage.md @@ -13,7 +13,7 @@ To list all your currently connected network storages, go to **{% my storage tit
    - You need to make sure you run a supported Home Assistant Supervised installation with the latest version of the [os-agent](https://github.com/home-assistant/os-agent). Make sure that your supervisor uses [slave bind propagation](https://docs.docker.com/storage/bind-mounts/#configure-bind-propagation) for the data volume. + You need to make sure you run a supported {% term "Home Assistant Supervised" %} installation with the latest version of the [os-agent](https://github.com/home-assistant/os-agent). Make sure that your supervisor uses [slave bind propagation](https://docs.docker.com/storage/bind-mounts/#configure-bind-propagation) for the data volume.
    diff --git a/source/_includes/common-tasks/specific_version.md b/source/_includes/common-tasks/specific_version.md index 5be8aeab77e..7af2f2a1052 100644 --- a/source/_includes/common-tasks/specific_version.md +++ b/source/_includes/common-tasks/specific_version.md @@ -1,4 +1,4 @@ -## Run a specific version +### Running a specific version {% assign current_version = site.current_major_version | append: "." | append: site.current_minor_version | append: "." | append: site.current_patch_version %} @@ -10,13 +10,15 @@ In the event that a Home Assistant Core version doesn't play well with your hard {% if page.installation == "os" or page.installation == "supervised" %} -You can use the CLI to upgrade to a specific version (`{{current_version}}` in this example), to downgrade your installation you should do a partial restore of a [backup](#backups) instead. +To upgrade to a specific version, you can use the CLI. The example below shows how to upgrade to `{{current_version}}`. ```bash ha core update --version {{current_version}} --backup ``` -_The_ `--backup` _flag here ensures that you have a partial backup of your current setup incase you need to downgrade._ +_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. {% elsif page.installation == "container" %} @@ -30,19 +32,19 @@ docker pull {{ site.installation.container }}:{{current_version}} 1. Stop the Home Assistant service. -2. Switch to the user that is running Home Assistant +2. Switch to the user that is running Home Assistant. ```bash sudo -u homeassistant -H -s ``` -3. Activate the virtual environment that Home Assistant is running in +3. Activate the virtual environment that Home Assistant is running in. ```bash source /srv/homeassistant/bin/activate ``` -4. Download and install the version you want +4. Download and install the version you want. ```bash pip3 install homeassistant=={{current_version}} diff --git a/source/_includes/common-tasks/update.md b/source/_includes/common-tasks/update.md index e4f924d7008..00498602479 100644 --- a/source/_includes/common-tasks/update.md +++ b/source/_includes/common-tasks/update.md @@ -1,11 +1,9 @@ -## Update +Best practice for updating Home Assistant Core: -Best practice for updating a Home Assistant installation: - -1. Backup your installation{% if page.installation == "os" or page.installation == "supervised" %}, using the backup functionality Home Assistant offers{% endif %}. +1. Backup your installation{% if page.installation == "os" or page.installation == "supervised" %}, using the [backup functionality](/common-tasks/os/#backups) Home Assistant offers{% endif %}. 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. +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 %} @@ -19,9 +17,9 @@ To update Home Assistant Core when you run Home Assistant {{ page.installation_n - title: Using the UI content: | - 1. Open your Home Assistant UI - 2. Navigate to the Settings panel - 3. On the top you will be presented with an update notification + 1. Open your Home Assistant UI. + 2. Navigate to the **Settings** panel. + 3. On the top you will be presented with an update notification. _If you do not see that notification you can click the overflow menu in the top right and select "Check for updates"._ diff --git a/source/_includes/dashboard/add_picture_to_card.md b/source/_includes/dashboard/add_picture_to_card.md new file mode 100644 index 00000000000..81f5c0c4061 --- /dev/null +++ b/source/_includes/dashboard/add_picture_to_card.md @@ -0,0 +1,20 @@ +{% capture name %}{{ include.name | default: page.title }}{% endcapture %} +{% capture domain %}{{ include.domain | default: page.ha_domain }}{% endcapture %} +{% capture title %}{{ include.title | default: page.title }}{% endcapture %} + +## Adding a {{ title | downcase }} to your dashboard + +1. To add a card, follow steps 1-4 on [adding a card from a view](/dashboards/cards/#to-add-a-card-from-a-view). + - In step 2, on the **By card** tab, select {{ title | downcase }}. + +2. Add a picture: + + - **Upload picture** lets you pick an image from the system used to show your Home Assistant UI. + - **Local path** lets you pick an image stored on Home Assistant. For example: `/homeassistant/images/lights_view_background_image.jpg`. + - To store an image on Home Assistant, you need to [configure access to files](/common-tasks/os/#configuring-access-to-files), for example via [Samba](/common-tasks/os/#installing-and-using-the-samba-add-on) or the [Studio Code Server](/common-tasks/os/#installing-and-using-the-visual-studio-code-vsc-add-on) add-on. + - **web URL** let you use an image from the web. For example `https://www.home-assistant.io/images/frontpage/assist_wake_word.png`. + +3. Define the parameters that are specific to the {{ title | downcase }}. + - For a description of the specific settings, refer to the description under YAML configuration. + - They also apply to the UI. +4. Save your changes. diff --git a/source/_includes/dashboard/edit_dashboard.md b/source/_includes/dashboard/edit_dashboard.md index d826f6906b9..0e5d9dd0bb1 100644 --- a/source/_includes/dashboard/edit_dashboard.md +++ b/source/_includes/dashboard/edit_dashboard.md @@ -3,6 +3,10 @@ {% capture title %}{{ include.title | default: page.title }}{% endcapture %} To add the {{ title | downcase }} to your user interface: -1. In the top right of the screen, select the three dots menu and then select **Edit dashboard**. - - By editing the dashboard, you are taking over control of this dashboard. This means that it is no longer automatically updated when new dashboard elements become available. To continue, in the dialog, select **Take control**. -2. In the bottom right corner, select the **Add card** button and select from the card picker. + +1. In the top right of the screen, select the pencil icon. + - If this is your first time editing a dashboard, the **Edit dashboard** dialog appears. + - By editing the dashboard, you are taking over control of this dashboard. + - This means that it is no longer automatically updated when new dashboard elements become available. + - To continue, in the dialog, select the three dots menu, then select **Take control**. +2. [Add a card](/dashboards/cards/#adding-cards-to-your-dashboard) to your dashboard. diff --git a/source/_includes/feedback.html b/source/_includes/feedback.html index cf651da824a..2801ad6bd01 100644 --- a/source/_includes/feedback.html +++ b/source/_includes/feedback.html @@ -1,6 +1,6 @@ {% unless page.feedback == false or page.layout == "landingpage" %} -