Raspberry Pi で Node-RED から exec コマンドを実行して Chromium キオスクモードを起動&終了するメモ

Raspberry Pi で Node-RED から exec コマンドを実行して Chromium キオスクモードを起動&終了するメモです。この記事は 2021年 ゆるくすすめる ( ワンフットシーバス ) GWアドベントカレンダー の3日目の記事でもあります。

Raspberry Pi で Chromium キオスクモードを使いたい

デジタルサイネージ的な制御を Raspberry Pi でやりたくなり、このあたりのナレッジは色々あったので以下の記事を中心に参考にしました。Raspberry Pi 4 4GB で 最新の Raspberry Pi (Raspberry Pi Desktop) のセットアップをするメモ 2021年1月版 の手順を行ったものを使っています。

Raspberry Pi 4 Model B をデジタルサイネージ風に使う – Qiita

他の記事もあわせて読みつつ https://1ft-seabass.jp/をキオスクモードで起動する場合は以下のようになりました。

sudo -u pi DISPLAY=":0.0" /usr/bin/chromium-browser --noerrdialogs --disable-infobars --disable-background-mod --kiosk --app=https://1ft-seabass.jp/

何も起動してない状態で、

image

これをターミナルから実行すると、

image

無事起動しました。

また、ターミナルを閉じたり Ctrl + C で中断すると、ウィンドウが閉じるので直感的でした。

また、当初、cannot open display のエラーが出ましたが ubuntu で root 時に cannot open display となる件 – たつこの部屋> をみて DISPLAY=":0.0" を追加してですプレイを指定できました。

Node-RED で起動はそのままいけたが、終了がキモ

先ほどの起動ナレッジを活かしつつ、フローは以下の通りになりました。

image

実は終了がキモで、通常 exec ノードで msg.kill でデータを送ってやるとプロセスが終了=ブラウザが終了することが多いのですが、今回の Chromium の場合はうまく終了せず、試行錯誤の末 pkill -o chromium で Chromium を名指しで呼ぶかたちで終了しています。

今回のフローの JSON データも置いておきます。

[{"id":"69ee6fa3.11d9a","type":"exec","z":"c4cb0142.08a11","command":"sudo -u pi DISPLAY=\":0.0\" /usr/bin/chromium-browser --noerrdialogs --disable-infobars --disable-background-mod --kiosk --app=https://1ft-seabass.jp/","addpay":false,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":660,"y":220,"wires":[["94af8fe7.3b7b"],[],["4ff67657.cde908"]]},{"id":"4026a123.325bf","type":"exec","z":"c4cb0142.08a11","command":"pkill -o chromium","addpay":false,"append":"","useSpawn":"false","timer":"","oldrc":false,"name":"","x":470,"y":340,"wires":[["97108d1a.4b592"],[],["f0d7246e.4b06f8"]]},{"id":"cb9b2066.cc998","type":"inject","z":"c4cb0142.08a11","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":200,"y":340,"wires":[["4026a123.325bf"]]},{"id":"97108d1a.4b592","type":"debug","z":"c4cb0142.08a11","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":690,"y":300,"wires":[]},{"id":"f0d7246e.4b06f8","type":"debug","z":"c4cb0142.08a11","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":690,"y":380,"wires":[]},{"id":"4ff67657.cde908","type":"debug","z":"c4cb0142.08a11","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1290,"y":260,"wires":[]},{"id":"94af8fe7.3b7b","type":"debug","z":"c4cb0142.08a11","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":1290,"y":180,"wires":[]},{"id":"4c9942e3.1f548c","type":"inject","z":"c4cb0142.08a11","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":180,"y":140,"wires":[["69ee6fa3.11d9a"]]},{"id":"7d0baac4.4a7c84","type":"comment","z":"c4cb0142.08a11","name":"Chromium 起動","info":"","x":180,"y":100,"wires":[]},{"id":"5d5756c3.4d73b8","type":"comment","z":"c4cb0142.08a11","name":"Chromium 終了","info":"","x":180,"y":300,"wires":[]}]