Skip to content

Instantly share code, notes, and snippets.

@ciotlosm
Last active February 5, 2024 15:04
Show Gist options
  • Star 67 You must be signed in to star a gist
  • Fork 10 You must be signed in to fork a gist
  • Save ciotlosm/1f09b330aa5bd5ea87b59f33609cc931 to your computer and use it in GitHub Desktop.
Save ciotlosm/1f09b330aa5bd5ea87b59f33609cc931 to your computer and use it in GitHub Desktop.
Kiosk mode for lovelace

Kiosk mode

Installation

Add kiosk.js file with the content below to your www folder in config.

Like any other custom script, use ui-lovelace.yaml resources section to reference the kiosk.js file.

Make sure you add kiosk somewhere in your URL. You can use it in the id of your view or in the query string.

Examples:

/lovelace/0?kiosk
views:
  - title: Kiosk
    icon: mdi:heart
    id: kiosk_alarm

Keep tabs

If you still want to keep the Lovelace tabs and hide everything else use add show_tabs in your URL as query string.

/lovelace/0?kiosk&show_tabs

Note

If this is your first file in www make sure you restart Home Assistant.

Update

Fixed based on the working fork here: https://gist.github.com/corrafig/c8288df960e7f59e82c12d14de26fde8

Credits

Thanks to @corrafig for the fixes

if (window.location.href.indexOf('kiosk') > 0) {
setTimeout(function () {
try {
const home_assistant_main = document
.querySelector("body > home-assistant").shadowRoot
.querySelector("home-assistant-main");
const header = home_assistant_main.shadowRoot
.querySelector("app-drawer-layout > partial-panel-resolver > ha-panel-lovelace").shadowRoot
.querySelector("hui-root").shadowRoot
.querySelector("#layout > app-header")
.style.display = "none";
const drawer = home_assistant_main.shadowRoot
.querySelector("#drawer")
.style.display = 'none';
home_assistant_main.style.setProperty("--app-drawer-width", 0);
home_assistant_main.shadowRoot
.querySelector("#drawer > ha-sidebar").shadowRoot
.querySelector("div.menu > paper-icon-button")
.click();
window.dispatchEvent(new Event('resize'));
}
catch (e) {
console.log(e);
}
}, 200);
}
resources:
- url: /local/kiosk.js
type: js
- url: /local/custom-lovelace/thermostat-card/thermostat-card.js?v=0.1
type: module
title: Lovelace Demo
views:
- title: Home
icon: mdi:heart
id: kiosk_thermostat
panel: true
cards:
- type: custom:thermostat-card
title: HVAC
entity: climate.hvac
@johan149
Copy link

I get this error on version 0.96.5"
TypeError: Cannot read property 'querySelector' of null
at kiosk.js:11

I made the following quick fix for myself:
https://gist.github.com/corrafig/c8288df960e7f59e82c12d14de26fde8

thanks man! it worked! there is anyway to keep the tabs from the top?

@esbenr
Copy link

esbenr commented Oct 23, 2019

After updating to HA 100.2 the kiosk mode doesent work.
It seems to break with
TypeError: Cannot read property 'click' of null at kiosk.js?v=3:19
I assume that menu button has changed name.

Collapsing the side-bar now minimizes the menu instead of hiding it. Which means that we might need to hide the side-bar instead of collapsing it.

Anybody made a fix for HA 100.2 yet?

/Esben

@ciotlosm
Copy link
Author

I'll try and have a look

@esbenr
Copy link

esbenr commented Oct 23, 2019

I'll try and have a look

Using @corrafig's modified worked.
Maybe mine was old. Sorry.

@ciotlosm
Copy link
Author

@esbenr thanks for letting me know. I've updated the original version here with the forked working version and updated credits to reflect contribution.

@AdamRidley
Copy link

It seems that in the latest fix show_tabs is no longer working. Any way to get it back?

@LucaBopf
Copy link

LucaBopf commented Nov 6, 2019

Same problem like @AdamRidley.

@jscott304
Copy link

Bump of the show_tabs function not working.

@anomaly256
Copy link

anomaly256 commented Dec 18, 2019

This one's working for me, including show_tabs. Note the removal of .shadowRoot on .querySelector('partial-panel-resolver'). I also changed the app_layout.style.minHeight to 50vh to get rid of an issue I had with scrollbars rendering when they weren't really necessary - but you may or may not want to change this back to 100vh as previous examples have

if (window.location.href.indexOf('kiosk') > 0) {
    setTimeout(function () {
        try {
            const drawer_layout = document
                    .querySelector('home-assistant').shadowRoot
                    .querySelector('home-assistant-main').shadowRoot
                    .querySelector('app-drawer-layout');
            const huiroot = drawer_layout
                    .querySelector('partial-panel-resolver')
                    .querySelector('ha-panel-lovelace').shadowRoot
                    .querySelector('hui-root').shadowRoot;
            const header = huiroot.querySelector('app-header');
            const toolbar = huiroot.querySelector('app-toolbar');
            const button_menu = toolbar.querySelector('ha-menu-button').shadowRoot;
            const app_drawer = drawer_layout.querySelector('app-drawer');
            if (window.location.href.indexOf('show_tabs') > 0) {
                toolbar.style.display = 'none';
            } else {
                header.style.display = 'none';
            }
            if(app_drawer.hasAttribute("opened")){
                button_menu.querySelector('paper-icon-button').click();
            }
            const app_layout = huiroot.querySelector('ha-app-layout').querySelector('#view')
            app_layout.style.minHeight = '50vh';
            window.dispatchEvent(new Event('resize'));
        }
        catch (e) {
            console.log(e);
        }
    }, 200);
}

@ulrikjo
Copy link

ulrikjo commented Dec 19, 2019

I'm using users and the "visible: - user:" configuration variable to only have certain Lovelace views show up on my tablet dashboard. The tabs can be hidden with kiosk mode but the sidebar is always visible when I'm using users other than my main administrator user. Any ideas why and how to solve this problem?

@johan149
Copy link

johan149 commented Jan 14, 2020

show_tabs not working anymore... anyone has a fix?

@ulrikjo
Copy link

ulrikjo commented Jan 14, 2020

Custom Header can be used as a replacement for kiosk.js, and it's well-maintained. You can install it (and keep it updated) through HACS if you use that.

@ulrikjo
Copy link

ulrikjo commented Jan 14, 2020

@illixion
Copy link

Here's my take at fixing show_tabs in this script, compatible with Home Assistant 0.111:

if (window.location.href.indexOf('kiosk') > 0) {
    setTimeout(function () {
        try {
            const home_assistant_main =  document
                  .querySelector("body > home-assistant").shadowRoot
                  .querySelector("home-assistant-main");
            
            if (window.location.href.indexOf('show_tabs') > 0) {
                const header = home_assistant_main.shadowRoot
                      .querySelector("app-drawer-layout > partial-panel-resolver > ha-panel-lovelace").shadowRoot
                      .querySelector("hui-root").shadowRoot
                      .querySelector("#layout > app-header > app-toolbar")
                      .style.display = "none";
            } else {
                const header = home_assistant_main.shadowRoot
                      .querySelector("app-drawer-layout > partial-panel-resolver > ha-panel-lovelace").shadowRoot
                      .querySelector("hui-root").shadowRoot
                      .querySelector("#layout > app-header")
                      .style.display = "none";
            }
            
            const drawer = home_assistant_main.shadowRoot
                  .querySelector("#drawer")
                  .style.display = 'none';
                  
            home_assistant_main.shadowRoot
                  .querySelector("app-drawer-layout > partial-panel-resolver > ha-panel-lovelace").shadowRoot
                  .querySelector("hui-root").shadowRoot
                  .querySelector("ha-app-layout")
                  .querySelector("app-header").style.left="0"

            home_assistant_main.style.setProperty("--app-drawer-width", 0);
            home_assistant_main.shadowRoot
                .querySelector("#drawer > ha-sidebar").shadowRoot
                .querySelector("div.menu > ha-icon-button")
                .click();
            // window.dispatchEvent(new Event('resize')); // messes up the layout
        }
        catch (e) {
            console.log(e);
        }
    }, 200);
}

@Pirol62
Copy link

Pirol62 commented Oct 8, 2020

Hi, I already learned, that custom header will be depricated with 116.x. Is there any chance, to bring this component into HACS?

@esbenr
Copy link

esbenr commented Oct 8, 2020

Hi, I already learned, that custom header will be depricated with 116.x. Is there any chance, to bring this component into HACS?

Hi.
Feel free to make a pullrequest. It’s open source.

@Pirol62
Copy link

Pirol62 commented Oct 8, 2020

Puh, ok. I have never done that. ;-)

@feradelectronics
Copy link

how is it possible to disable the side menu for non administrator accounts and make header compact?
It would also be nice to add elements eg. time and other entities to the top right side. Sample below.
Header
Any help and code suggestions would be greatly appreciated.

@byte4geek
Copy link

Thanks for the kiosk mode.
The kiosk mode was installed via HACS on Hassio and no other action i made and if i use lovelace/0?kiosk the kiosk mode works fine.
But if i use lovelace/0?kiosk&show_tabs i can't see the tabs.
What can i check?
I missing sometings?

@damienjmiller
Copy link

@byte4geek - I just had the same problem then I realised I had this (https://github.com/maykar/kiosk-mode) installed which was over-riding this - could you be having the same issue?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment