Home Assistant:下称 hass

去年疫情居家期间用闲置的 iPad mini 安装 hass app 实现了 dashboard,可以查看时间、天气、各个房间温湿度、控制全屋电灯开关、路由器上下行带宽、车辆状态(搭配 TeslaMate)等,使用起来体验不错。

最近有需求要能方便扫一眼就能看到时间,直接摆个时钟显得无趣,而 iPad LCD屏 常亮又会比较打扰。所以研究用电子墨水屏来充当 Always-On 显示屏。一开始打算用esp32自己组一个,再一想与其自己再写套界面,不如就用闲置的 Kindle Paperwhite,有内置浏览器可以直接加载 hass web界面,应该马上就能搞定。

实际操作起来还是有坑的,下面是碰到的问题和解法记录。

Kindle 屏幕常亮

Kindle 系统设置里没有屏幕常亮选项,直接问 Bard 得知在浏览器地址栏里输入 ~ds 就能禁用自动休眠。测试确认可用。 (开启后按电源键也不会休眠,需要重启才能恢复。)

浏览器能力

Kindle内置的浏览器叫 Experimantal Browser,一看名字就比较菜——不支持 css transform、js貌似只有es3、Date时区有时是 +8 有时是 +0 ——所以连简单的 format 时间都不对。

实现方案

所以浏览器页面就只实现最简单的功能:时间显示(每分钟刷新)和 图片显示(10分钟级别刷新)。

时间显示需要 fix一下时区问题,根据当前浏览器自认为的时区换算成 +8 再 format。为了让分钟更新精准些,不能直接使用 setInterval(_, 1000),需要先算出距离下一分钟开始的剩余秒数再 setTimeout

图片地址其实一个接口:在本地媒体服务器上起一个node服务,当请求图片时调用 pptr 在 chrome里打开 hass 页面截图,然后返回 image/jpeg 的二进制图片数据。 这下子真的 SSR (Server side rendering) 了。

为了让图片在墨水屏上显示更清晰,在截图之前往页面里加点料:

await page.evaluate(() => {
    document.body.style.cssText = `
        --lovelace-background: white;
        filter: saturate(1.5) grayscale(1) contrast(1.12);
    `;
});

部署之后发现网页长时间打开浏览器就crash了,所以再加上小时级别的页面刷新避免。