Home Assistant dashboard on Kindle

as always, i’m late for the party.
Here is my working pupeteer script.
if you normally have SSL errors because for example you use the IP instead of the URL set ignoreHTTPSErrors to true.

const puppeteer = require('puppeteer');

// either change the settings here or run node with variables e.g. 
// login_page="https://homeassistant.underknowledge.cc/" login_username="root" login_password="un52SDvVfVOscyRVKi0D46p4NPbd8GXrDXFtHSd" node ha_test.js
const login_page = process.env.login_page || "https://homeassistant.underknowledge.cc/";
const login_username = process.env.login_username || "root";
const login_password = process.env.login_password || "un52SDvVfVOscyRVKi0D46p4NPbd8GXrDXFtHSd";


function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

(async () => {
  const browser = await puppeteer.launch({
  headless: false,
  defaultViewport:{width:1366,height:768},
  ignoreHTTPSErrors: false,
  });
  const page = await browser.newPage();
  await page.goto(login_page, { waitUntil: 'networkidle0' });

  // find shadow elements by js selector
  const username = await page.evaluateHandle(`document.querySelector("body > div > ha-authorize").shadowRoot.querySelector("ha-auth-flow").shadowRoot.querySelector("form > ha-form").shadowRoot.querySelector("div > ha-form-string:nth-child(1)").shadowRoot.querySelector("mwc-textfield").shadowRoot.querySelector("label > input")`);
  await username.type(login_username);

  const password = await page.evaluateHandle(`document.querySelector("body > div > ha-authorize").shadowRoot.querySelector("ha-auth-flow").shadowRoot.querySelector("form > ha-form").shadowRoot.querySelector("div > ha-form-string:nth-child(2)").shadowRoot.querySelector("mwc-textfield").shadowRoot.querySelector("label > input")`);
  await password.type(login_password);

  const loginHandle = await page.evaluateHandle(`document.querySelector("body > div > ha-authorize").shadowRoot.querySelector("ha-auth-flow").shadowRoot.querySelector("form > div > mwc-button")`);
  await loginHandle.click();
  
  await sleep(1000); // my lovelace has to load a lot of pictures

  const sidebarHandle = await page.evaluateHandle(`document.querySelector("body > home-assistant").shadowRoot.querySelector("home-assistant-main").shadowRoot.querySelector("#drawer > ha-sidebar").shadowRoot.querySelector("div.menu > ha-icon-button").shadowRoot.querySelector("mwc-icon-button > ha-svg-icon")`);
  await sidebarHandle.click();
  await sleep(4500); // I guess the page resize does not render this fast
  // 
  // fullscreen screenshot, see https://pptr.dev/#?product=Puppeteer&version=v13.0.1&show=api-pagescreenshotoptions for further options
  screenshot = await page.screenshot({path: 'home_assistant.png', fullPage: true});

//   // partial, play around yourself dont ignore the const browser settings above
//   await page.screenshot({
//     path: 'home_assistant.jpg',
//     type: 'jpeg',
//     quality: 80,
//     clip: { x: 60, y: 145, width: 1010, height: 1150 }
//     });

  await browser.close();
})();

Now I want to learn how I can write an add-on to have pupeteer right with HA


Edit:

2 Likes