kimmobrunfeldt
Repos
94
Followers
481
Following
74

Online version of the Labyrinth board game. The game server runs on the host's browser and networking happens peer-to-peer.

Battery-powered E-Ink weather display for our home.

C
240
15

Personal blog at kimmo.blog

Responsive and slick progress bars

7662
1424

Run commands concurrently. Like `npm run watch-js & npm run watch-less` but better.

5868
196

Detect table football score from camera image with machine vision

68
3

Events

opened issue
Piping render to deploy command is potentially dangerous

This isn't a bug in code but a note from the documentation. I'm opening this up for knowledge sharing purposes. We've used krane for deployments for a few years now. Along the way we've had a few incidents including downtime where rendering an empty output (due to error during rendering), caused deploy command to prune all resources.

I spotted two references from the documentation where piping is mentioned. First under Using templates:

If you want dynamic templates, you may render ERB with krane render and then pipe that result to krane deploy -f -.

Second under Deploy walkthrough:

You can test this out for yourself by running the following command:

krane render -f test/fixtures/hello-cloud --current-sha 1 | krane deploy my-namespace my-k8s-cluster -f -

As soon as you run this, you'll start seeing some output being streamed to STDERR.

The latter reference says "you can test this" but nevertheless it ended up being the command used for our production deployments.

Bash piping starts both commands at the same time (ref), so krane deploy doesn't have a way to know that krane render exited with non-zero exit code. We use -o pipefail, but it doesn't help to prevent this scenario. It only affects on the final exit code of the pipeline operation (ref). --no-prune would prevent this but it's not recommended with reasoning I agree with:

Not recommended, as it allows your namespace to accumulate cruft that is not reflected in your deploy directory.

Would you be up for a documentation PR that removes the piping recommendations and adds a warning about it? We changed the render-deploy one liner to two separate commands: 1) render ... > output.yml 2) deploy -f output.yml. This in combination with set -e makes the deployments commands safe.

There could be alternative solutions. For example deploy command requiring e.g. a single empty line written in stdin to prune resources, and render command would be changed to reflect this. I'm not that familiar with krane so take the suggestion with a grain of salt.

Created at 1 week ago
Neat build - any updates on battery life?

During last week the discharge rate changed. I've been expecting something like this. Still the linear regression looks like it could last ~8months total, but I'm guessing the actual number is ~4-5months. graph

Created at 2 weeks ago
pull request opened
Use File.exist over deprecated File.exists

Fixes #322.

I was able to confirm this fixing the issue on my Mac 12.6, ruby 3.2.0.

Created at 2 weeks ago

Use File.exist over deprecated File.exists

Created at 2 weeks ago
Neat build - any updates on battery life?

Update:

graph

Created at 3 weeks ago

Make temp and precipitation graphs more visible

Created at 1 month ago

Revert "Remove error.png from version control"

This reverts commit f94a7f41961566e6ce50f6cd363dad0632823d54.

Created at 1 month ago

Remove error.png from version control

Created at 1 month ago

Don't show next trophy when spectating

Created at 1 month ago

Tune visual to fit actual screen

Created at 1 month ago

Improve day min max visual look

Created at 1 month ago

Improve day min max visual look

Created at 1 month ago

Restructure assets

Implement today and tomorrow temp and rain graphs with d3

Created at 1 month ago

Add precipitation histograms and temp dots to short term forecast

Created at 1 month ago

Update README.md

Created at 1 month ago

Update README.md

Created at 1 month ago
issue comment
Switching to a different page using navigate service calls starts at same location

I investigated this further within my own HA dev environment.

History.scrollRestoration is 'auto' by default and not overridden within HA frontend so browser will try and restore the scroll position.

When testing how scrollRestoration should work with my own minimal HTML (copied at the bottom of this post if interested), I noticed browser requires a precise sequencing of history.pushState vs rendering new content to DOM. My example HTML at the bottom works as "regular" static websites (no history.pushState or dynamic DOM content) do.

Possible fix ideas that came to my mind:

  • Change HA frontend so that navigate function is called at the correct time within the dashboard rendering process. This requires deeper knowledge of the rendering pipeline which I don't have.
  • Change scrollRestoration to manual and implement a new mechanism in HA frontend to save and restore previous scroll positions.

To solve my immediate pain, I implemented a pretty horrible hack. I do not recommend copying this, but sharing it here if it helps solving the core issue. In our default dashboard, I added a visually hidden button-card custom card which allows running arbitrary JS in the user's browser once the page is loaded. In that JS I monkey patch the global window.history.pushState to implement the second fix I suggested above.

type: custom:button-card
styles:
  card:
    - height: 0px
    - opacity: 0
name: |
  [[[
    if (!window.__monkeyPatchDone) {
      window.__previousScrollY = 0;  
      const originalPushState = window.history.pushState;
    
      window.history.pushState = (state, unused, url) => { 
        console.log('Monkey patched pushState called!')
        window.__previousScrollY = window.scrollY;
        originalPushState.apply(window.history, [state, unused, url]);
        setTimeout(() => window.scrollTo({ top: 0 }), 1)
      }
    
      window.addEventListener('popstate', (event) => {
        // This trick covers user bouncing back and forward
        const currScrollY = window.scrollY;
        const prevScrollY = window.__previousScrollY
        window.__previousScrollY = currScrollY;
    
        if (Number.isFinite(prevScrollY)) {
          setTimeout(() => {
            window.scrollTo({
              top: prevScrollY
            })
            console.log(`Scrolled to ${prevScrollY}`);
          }, 5);
          setTimeout(() => console.log('Scroll now', window.scrollY), 200)
        } 
      });
    
      window.history.scrollRestoration = 'manual';  
      window.__previousScrollY = window.scrollY;
    
      console.log('Monkey patch done!')
    }
    window.__monkeyPatchDone = true;
  ]]]
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Test</title>
    <script>
      function items(n) {
        const items = [];
        for (let i = 0; i < n; ++i) {
          items.push(i)
        }
        return items
      }

      const router = {
        '/': () => {
          const content = document.querySelector('#content')
          // XXX: Don't copy this for real apps (XSS-unsafe)
          content.innerHTML = `<ul class="red">
            ${items(100).map(i => {
              return `<li>
                <button id="#link${i}">Push state "Subview"</button>
              </li>`
            }).join('\n')}
          </ul>`

          const elems = document.querySelectorAll("li > button");
          elems.forEach((el) => el.addEventListener('click', () => {
            render('/subview/')
          }))
        },

        '/subview/': () => {
          const content = document.querySelector('#content')
          content.innerHTML = `<ul class="red">
            ${items(100).map(i => {
              return `<li>
                <button id="#link${i}">Push state "Home"</button>
              </li>`
            }).join('\n')}
          </ul>`

          const elems = document.querySelectorAll("li > button");
          elems.forEach((el) => el.addEventListener('click', () => {
            render('/')
          }))
        }
      }

      function render(route, replace = false) {
        document.querySelector('#content').innerHTML = ''

        if (replace) {
          history.replaceState({}, '', route)
        } else {
          history.pushState({}, '', route)
        }

        const fn = router[route]
        if (!fn) {
          throw new Error(`Route ${route} not found`)
        }
        setTimeout(fn, 0)
      }

      window.addEventListener('load', () => {
        render('/', true)
      })
    </script>

    <style>
      html, body {
        width: 100%;
      }

      #content {
        width: 100%;
      }

      ul {
        list-style: none;
      }

      ul, li {
        width: 100%;
        margin: 0;
        padding: 0;
      }

      li {
        padding: 10px 0;
      }

      ul > li:nth-child(even) {
        background: #ddd;
      }
    </style>
  </head>
  <body>
    <div id="content"></div>
  </body>
</html>
title: Dev Home
views:
  - path: default_view
    title: Home
    cards:
      - type: vertical-stack
        cards:
          - type: markdown
            content: >-
              ## Section 1

              Lorem ipsum dolor sit amet, consectetur adipiscing elit.
              Suspendisse quis rhoncus nulla. Nulla vel odio pulvinar, dapibus
              massa at, dictum orci. Vestibulum eu ullamcorper ex, eget
              hendrerit est. In ex est, cursus et faucibus et, luctus ut est.
              Fusce at risus sapien. Vivamus egestas hendrerit eros, rhoncus
              semper sem vestibulum ut. Aliquam fringilla diam ac facilisis
              finibus. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
              Etiam sed risus in ex ultricies tincidunt rutrum et mauris.
              Suspendisse egestas ante vel nibh congue maximus et eget orci.
              Phasellus sagittis interdum ipsum et feugiat.

              Phasellus dapibus tempor libero, et aliquet nisl bibendum id.
              Praesent gravida felis id turpis sagittis, lacinia dignissim risus
              suscipit. Maecenas lorem tortor, consectetur nec aliquet ac,
              lobortis at diam. Integer molestie cursus fermentum. Nulla ut ante
              augue. Pellentesque ligula velit, congue in lacus vel, efficitur
              semper neque. Morbi id sapien ac justo fermentum aliquet. Nam
              tempus sem at mauris efficitur, id placerat tellus mattis. Integer
              lectus enim, blandit at ligula at, placerat interdum orci. Integer
              quam sapien, fermentum nec blandit et, pretium placerat est.

              For more information see the [Markdown
              Cheatsheet](https://commonmark.org/help).
          - type: horizontal-stack
            cards:
              - show_name: true
                show_icon: true
                type: button
                entity: ''
                icon: mdi:arrow-right-thin-circle-outline
                hold_action:
                  action: none
                name: All lights
                tap_action:
                  action: navigate
                  navigation_path: /lovelace/all-lights
              - show_name: true
                show_icon: true
                type: button
                tap_action:
                  action: navigate
                  navigation_path: /lovelace/kitchen
                entity: ''
                icon: mdi:arrow-right-thin-circle-outline
                name: Kitchen
                hold_action:
                  action: none
          - type: markdown
            content: >-
              ## Section 2

              Lorem ipsum dolor sit amet, consectetur adipiscing elit.
              Suspendisse quis rhoncus nulla. Nulla vel odio pulvinar, dapibus
              massa at, dictum orci. Vestibulum eu ullamcorper ex, eget
              hendrerit est. In ex est, cursus et faucibus et, luctus ut est.
              Fusce at risus sapien. Vivamus egestas hendrerit eros, rhoncus
              semper sem vestibulum ut. Aliquam fringilla diam ac facilisis
              finibus. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
              Etiam sed risus in ex ultricies tincidunt rutrum et mauris.
              Suspendisse egestas ante vel nibh congue maximus et eget orci.
              Phasellus sagittis interdum ipsum et feugiat.


              For more information see the [Markdown
              Cheatsheet](https://commonmark.org/help).
          - type: horizontal-stack
            cards:
              - show_name: true
                show_icon: true
                type: button
                entity: ''
                icon: mdi:arrow-right-thin-circle-outline
                hold_action:
                  action: none
                name: All lights
                tap_action:
                  action: navigate
                  navigation_path: /lovelace/all-lights
              - show_name: true
                show_icon: true
                type: button
                tap_action:
                  action: navigate
                  navigation_path: /lovelace/kitchen
                entity: ''
                icon: mdi:arrow-right-thin-circle-outline
                name: Kitchen
                hold_action:
                  action: none
          - type: markdown
            content: >-
              ## Section 3

              Lorem ipsum dolor sit amet, consectetur adipiscing elit.
              Suspendisse quis rhoncus nulla. Nulla vel odio pulvinar, dapibus
              massa at, dictum orci. Vestibulum eu ullamcorper ex, eget
              hendrerit est. In ex est, cursus et faucibus et, luctus ut est.
              Fusce at risus sapien. Vivamus egestas hendrerit eros, rhoncus
              semper sem vestibulum ut. Aliquam fringilla diam ac facilisis
              finibus. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
              Etiam sed risus in ex ultricies tincidunt rutrum et mauris.
              Suspendisse egestas ante vel nibh congue maximus et eget orci.
              Phasellus sagittis interdum ipsum et feugiat.


              For more information see the [Markdown
              Cheatsheet](https://commonmark.org/help).
          - type: markdown
            content: >-
              The **Markdown** card allows you to write any text. You can style
              it **bold**, *italicized*, ~strikethrough~ etc. You can do images,
              links, and more.

              Lorem ipsum dolor sit amet, consectetur adipiscing elit.
              Suspendisse quis rhoncus nulla. Nulla vel odio pulvinar, dapibus
              massa at, dictum orci. Vestibulum eu ullamcorper ex, eget
              hendrerit est. In ex est, cursus et faucibus et, luctus ut est.
              Fusce at risus sapien. Vivamus egestas hendrerit eros, rhoncus
              semper sem vestibulum ut. Aliquam fringilla diam ac facilisis
              finibus. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
              Etiam sed risus in ex ultricies tincidunt rutrum et mauris.
              Suspendisse egestas ante vel nibh congue maximus et eget orci.
              Phasellus sagittis interdum ipsum et feugiat.


              For more information see the [Markdown
              Cheatsheet](https://commonmark.org/help).
          - type: horizontal-stack
            cards:
              - show_name: true
                show_icon: true
                type: button
                entity: ''
                icon: mdi:arrow-right-thin-circle-outline
                hold_action:
                  action: none
                name: All lights
                tap_action:
                  action: navigate
                  navigation_path: /lovelace/all-lights
              - show_name: true
                show_icon: true
                type: button
                tap_action:
                  action: navigate
                  navigation_path: /lovelace/kitchen
                entity: ''
                icon: mdi:arrow-right-thin-circle-outline
                name: Kitchen
                hold_action:
                  action: none
  - theme: Backend-selected
    title: Kitchen
    path: kitchen
    subview: true
    badges: []
    cards:
      - type: vertical-stack
        cards:
          - type: markdown
            content: '# Kitchen'
          - show_name: true
            show_icon: true
            type: button
            entity: ''
            icon: mdi:arrow-left-thin-circle-outline
            hold_action:
              action: none
            name: Navigate home (pushState)
            tap_action:
              action: navigate
              navigation_path: /lovelace/default_view
          - type: markdown
            content: >-
              The **Markdown** card allows you to write any text. You can style
              it **bold**, *italicized*, ~strikethrough~ etc. You can do images,
              links, and more.

              Lorem ipsum dolor sit amet, consectetur adipiscing elit.
              Suspendisse quis rhoncus nulla. Nulla vel odio pulvinar, dapibus
              massa at, dictum orci. Vestibulum eu ullamcorper ex, eget
              hendrerit est. In ex est, cursus et faucibus et, luctus ut est.
              Fusce at risus sapien. Vivamus egestas hendrerit eros, rhoncus
              semper sem vestibulum ut. Aliquam fringilla diam ac facilisis
              finibus. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
              Etiam sed risus in ex ultricies tincidunt rutrum et mauris.
              Suspendisse egestas ante vel nibh congue maximus et eget orci.
              Phasellus sagittis interdum ipsum et feugiat.

              Mauris interdum pulvinar tortor, non finibus nisi vestibulum ac.
              Proin dapibus felis porta, accumsan risus eget, mattis nisl.
              Curabitur commodo imperdiet diam, eget sagittis mi feugiat sed.
              Morbi felis lectus, gravida non commodo sit amet, gravida id
              tellus. Morbi erat ipsum, tristique vitae rutrum vitae, convallis
              a eros. Sed a sem elementum metus fermentum facilisis. Proin
              ornare nisi tortor, vitae semper justo sagittis vitae. Maecenas
              neque neque, tincidunt eget tempus id, pretium at purus. Class
              aptent taciti sociosqu ad litora torquent per conubia nostra, per
              inceptos himenaeos. Mauris volutpat ullamcorper dolor at tempus.
              Nam volutpat, libero vel ultricies consequat, dui tortor imperdiet
              magna, vel lobortis nulla leo id enim. Aenean non tempor odio, in
              vulputate ante. Nulla tristique ligula vel nibh congue, sit amet
              varius nibh dapibus. Suspendisse in nisl ac massa egestas
              vulputate in vitae nunc.

              Phasellus dapibus tempor libero, et aliquet nisl bibendum id.
              Praesent gravida felis id turpis sagittis, lacinia dignissim risus
              suscipit. Maecenas lorem tortor, consectetur nec aliquet ac,
              lobortis at diam. Integer molestie cursus fermentum. Nulla ut ante
              augue. Pellentesque ligula velit, congue in lacus vel, efficitur
              semper neque. Morbi id sapien ac justo fermentum aliquet. Nam
              tempus sem at mauris efficitur, id placerat tellus mattis. Integer
              lectus enim, blandit at ligula at, placerat interdum orci. Integer
              quam sapien, fermentum nec blandit et, pretium placerat est.

              For more information see the [Markdown
              Cheatsheet](https://commonmark.org/help).
          - type: markdown
            content: >-
              The **Markdown** card allows you to write any text. You can style
              it **bold**, *italicized*, ~strikethrough~ etc. You can do images,
              links, and more.

              Phasellus dapibus tempor libero, et aliquet nisl bibendum id.
              Praesent gravida felis id turpis sagittis, lacinia dignissim risus
              suscipit. Maecenas lorem tortor, consectetur nec aliquet ac,
              lobortis at diam. Integer molestie cursus fermentum. Nulla ut ante
              augue. Pellentesque ligula velit, congue in lacus vel, efficitur
              semper neque. Morbi id sapien ac justo fermentum aliquet. Nam
              tempus sem at mauris efficitur, id placerat tellus mattis. Integer
              lectus enim, blandit at ligula at, placerat interdum orci. Integer
              quam sapien, fermentum nec blandit et, pretium placerat est.

              For more information see the [Markdown
              Cheatsheet](https://commonmark.org/help).
          - show_name: true
            show_icon: true
            type: button
            entity: ''
            icon: mdi:arrow-left-thin-circle-outline
            hold_action:
              action: none
            name: Navigate home (pushState)
            tap_action:
              action: navigate
              navigation_path: /lovelace/default_view
          - type: markdown
            content: >-
              The **Markdown** card allows you to write any text. You can style
              it **bold**, *italicized*, ~strikethrough~ etc. You can do images,
              links, and more.

              Phasellus dapibus tempor libero, et aliquet nisl bibendum id.
              Praesent gravida felis id turpis sagittis, lacinia dignissim risus
              suscipit. Maecenas lorem tortor, consectetur nec aliquet ac,
              lobortis at diam. Integer molestie cursus fermentum. Nulla ut ante
              augue. Pellentesque ligula velit, congue in lacus vel, efficitur
              semper neque. Morbi id sapien ac justo fermentum aliquet. Nam
              tempus sem at mauris efficitur, id placerat tellus mattis. Integer
              lectus enim, blandit at ligula at, placerat interdum orci. Integer
              quam sapien, fermentum nec blandit et, pretium placerat est.

              For more information see the [Markdown
              Cheatsheet](https://commonmark.org/help).
          - show_name: true
            show_icon: true
            type: button
            entity: ''
            icon: mdi:arrow-left-thin-circle-outline
            hold_action:
              action: none
            name: Navigate home (pushState)
            tap_action:
              action: navigate
              navigation_path: /lovelace/default_view
  - theme: Backend-selected
    title: All lights
    path: all-lights
    subview: true
    badges: []
    cards:
      - type: vertical-stack
        cards:
          - type: markdown
            content: '# All lights'
          - show_name: true
            show_icon: true
            type: button
            entity: ''
            icon: mdi:arrow-left-thin-circle-outline
            hold_action:
              action: none
            name: Navigate home (pushState)
            tap_action:
              action: navigate
              navigation_path: /lovelace/default_view
          - type: markdown
            content: >-
              The **Markdown** card allows you to write any text. You can style
              it **bold**, *italicized*, ~strikethrough~ etc. You can do images,
              links, and more.

              Lorem ipsum dolor sit amet, consectetur adipiscing elit.
              Suspendisse quis rhoncus nulla. Nulla vel odio pulvinar, dapibus
              massa at, dictum orci. Vestibulum eu ullamcorper ex, eget
              hendrerit est. In ex est, cursus et faucibus et, luctus ut est.
              Fusce at risus sapien. Vivamus egestas hendrerit eros, rhoncus
              semper sem vestibulum ut. Aliquam fringilla diam ac facilisis
              finibus. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
              Etiam sed risus in ex ultricies tincidunt rutrum et mauris.
              Suspendisse egestas ante vel nibh congue maximus et eget orci.
              Phasellus sagittis interdum ipsum et feugiat.

              Mauris interdum pulvinar tortor, non finibus nisi vestibulum ac.
              Proin dapibus felis porta, accumsan risus eget, mattis nisl.
              Curabitur commodo imperdiet diam, eget sagittis mi feugiat sed.
              Morbi felis lectus, gravida non commodo sit amet, gravida id
              tellus. Morbi erat ipsum, tristique vitae rutrum vitae, convallis
              a eros. Sed a sem elementum metus fermentum facilisis. Proin
              ornare nisi tortor, vitae semper justo sagittis vitae. Maecenas
              neque neque, tincidunt eget tempus id, pretium at purus. Class
              aptent taciti sociosqu ad litora torquent per conubia nostra, per
              inceptos himenaeos. Mauris volutpat ullamcorper dolor at tempus.
              Nam volutpat, libero vel ultricies consequat, dui tortor imperdiet
              magna, vel lobortis nulla leo id enim. Aenean non tempor odio, in
              vulputate ante. Nulla tristique ligula vel nibh congue, sit amet
              varius nibh dapibus. Suspendisse in nisl ac massa egestas
              vulputate in vitae nunc.

              Phasellus dapibus tempor libero, et aliquet nisl bibendum id.
              Praesent gravida felis id turpis sagittis, lacinia dignissim risus
              suscipit. Maecenas lorem tortor, consectetur nec aliquet ac,
              lobortis at diam. Integer molestie cursus fermentum. Nulla ut ante
              augue. Pellentesque ligula velit, congue in lacus vel, efficitur
              semper neque. Morbi id sapien ac justo fermentum aliquet. Nam
              tempus sem at mauris efficitur, id placerat tellus mattis. Integer
              lectus enim, blandit at ligula at, placerat interdum orci. Integer
              quam sapien, fermentum nec blandit et, pretium placerat est.

              For more information see the [Markdown
              Cheatsheet](https://commonmark.org/help).
          - type: markdown
            content: >-
              The **Markdown** card allows you to write any text. You can style
              it **bold**, *italicized*, ~strikethrough~ etc. You can do images,
              links, and more.

              Phasellus dapibus tempor libero, et aliquet nisl bibendum id.
              Praesent gravida felis id turpis sagittis, lacinia dignissim risus
              suscipit. Maecenas lorem tortor, consectetur nec aliquet ac,
              lobortis at diam. Integer molestie cursus fermentum. Nulla ut ante
              augue. Pellentesque ligula velit, congue in lacus vel, efficitur
              semper neque. Morbi id sapien ac justo fermentum aliquet. Nam
              tempus sem at mauris efficitur, id placerat tellus mattis. Integer
              lectus enim, blandit at ligula at, placerat interdum orci. Integer
              quam sapien, fermentum nec blandit et, pretium placerat est.

              For more information see the [Markdown
              Cheatsheet](https://commonmark.org/help).
          - show_name: true
            show_icon: true
            type: button
            entity: ''
            icon: mdi:arrow-left-thin-circle-outline
            hold_action:
              action: none
            name: Navigate home (pushState)
            tap_action:
              action: navigate
              navigation_path: /lovelace/default_view
          - type: markdown
            content: >-
              The **Markdown** card allows you to write any text. You can style
              it **bold**, *italicized*, ~strikethrough~ etc. You can do images,
              links, and more.

              Phasellus dapibus tempor libero, et aliquet nisl bibendum id.
              Praesent gravida felis id turpis sagittis, lacinia dignissim risus
              suscipit. Maecenas lorem tortor, consectetur nec aliquet ac,
              lobortis at diam. Integer molestie cursus fermentum. Nulla ut ante
              augue. Pellentesque ligula velit, congue in lacus vel, efficitur
              semper neque. Morbi id sapien ac justo fermentum aliquet. Nam
              tempus sem at mauris efficitur, id placerat tellus mattis. Integer
              lectus enim, blandit at ligula at, placerat interdum orci. Integer
              quam sapien, fermentum nec blandit et, pretium placerat est.

              For more information see the [Markdown
              Cheatsheet](https://commonmark.org/help).
          - show_name: true
            show_icon: true
            type: button
            entity: ''
            icon: mdi:arrow-left-thin-circle-outline
            hold_action:
              action: none
            name: Navigate home (pushState)
            tap_action:
              action: navigate
              navigation_path: /lovelace/default_view
Created at 1 month ago