(3)RaspberryPiとタッチディスプレイで自動起動LocalUIFlowサーバーを作る - xAutomationで操作不要に
(1)で、実用できるLocalUIFlowサーバーが作成できました。
使用レポートは(2)で。
概要
Raspberry Pi4で構築したLocalUIFlowサーバーと、80台をさばくことができるルーターをLANケーブルで接続し、双方を電源タップに繋いであります。タップをコンセントにつなぐと、ルーターとRaspberryPi 4が起動し、RaspberryPi 4で自動起動した、LocalUIFlowアプリケーションの「Start」をタッチパネルディスプレイで押すことでLocalUIFlowがローカルサーバーとして起動します。
マウス操作でもよいのですが、タッチパネルにしたのは、特に別デバイスがなくても操作が可能なようにしたかったためです。
実際に運用して
実用上は問題なく、授業に活用することができました。それについては(2)で述べています。
ただ、授業に一式持っていって、コンセントにつないで「Start」を押すのが、地味に面倒くさい。
……いや、「面倒くさい」というのは適切ではないかもしれません。これでも極力面倒事を排除した結果で、「コンセントつないで、電源入れて、LocalUIFlowアプリを手動で起動して、「Start」押して…」となるよりも自動起動させるようにしたおかげで「コンセントつないで、電源入れて、表示されたStartを押すだけ!」と相当楽なのですが、最後の1手順すら省いて、「コンセントにつなぐだけ!」にしたくなるというのは、人間の手間をなるべく減らしたいという欲求はすごいものだと感じます。
LocalUIFlowが、コマンドラインアプリなら、起動オプションとかでなんとかなるのですが、相手はGUIアプリです。アプリケーション上のボタンを押さねばなりません。
これは、環境構築時にもどうしようか悩んだところで、参考にさせていただいた、武藤武士さんのページ
でも、reTerminal(タッチディスプレイ付きのRaspberry Pi Compute Module 4ベースのコンピュータ)を利用してGUIのボタン押し問題を解決していました。
reTerminalはCM4ベースということで高すぎるので、RaspberryPi 4に外付けのタッチパネルディスプレイで代用したのが私の(1)の記事でした。
デスクトップ動作も自動化
Microsoft Power Automate関連の「デスクトップ操作を自動化して効率化!」みたいな記事を見て、ふと思い立ちました。
「あれ?これLinuxでもできれば、LocalUIFlowを完全自動化できるのでは……?」
調べてみると、Linux界隈ではxautomationというものがあり、導入するとxteコマンドでデスクトップの操作ができるようです。そして、RaspberryPi OSでもできると…!
(参考)
■Linux xautomation
■Raspberry Pi xautomation (webarchive)
構築方法
途中まで、試しにやってみて、記録が残っていないのでざっとの説明になります。まぁ、もともとnoteを備忘録代わりにしているので、勘弁してください。
まずはxautomationを入れ、xteコマンドが使用できるようにします。
ターミナルから、apt-getでインストールします。
sudo apt-get install xautomation
自分の環境では、このときシステムから「なんか足りないんだけど」と言われましたが、とりあえずOKして、なんとかしてもらいました。(適当)
xautomationがインストールされれば、xteコマンドが利用できるようになります。
まずは、LocalUIFlowのGUI、「Start」ボタン上にマウスカーソルを持っていき、
xmousepos
で、座標を調べます。
結果、
249 205 ??? ???
の結果が返ってきました。(???は忘れました)
これは、
とのことで、結果、
xte 'mousemoce 250 200'
でカーソルが「Start」ボタン上まで移動することを確認できました。
シェルスクリプトを書きます。
nano エディタで、ファイルを新規作成し、
#!/bin/sh
sleep 13s
xte 'mousemove 250 200'
sleep 1s
xte 'mouseclick 1'
という内容のファイルを作成します。(nanoエディタについては(1)の記事を参考にしてもらえれば操作方法が分かると思います)
「sleep 13s」は、LocalUIFlowのアプリの起動までの時間から算出したウェイトです。また、「mouseclick 1」で左クリックをエミュレートしています。
この内容を「click.sh」としてデスクトップに保存し、(1)の記事で作成した「autorun.sh」を変更します。
【変更前】autorun.sh
#!/bin/sh
cd /home/{ユーザー名}/{任意のディレクトリ}/
LC_ALL=C ./UIFlow.Server.Desktop
【変更後】autorun.sh
#!/bin/sh
/home/{ユーザー名}/Desktop/click.sh &
cd /home/{ユーザー名}/{任意のディレクトリ}/
LC_ALL=C ./UIFlow.Server.Desktop
2行目の「/home/{ユーザー名}/Desktop/click.sh &」が追加されたコマンドです。シェルスクリプト「click.sh」を起動しています。語尾の「 &」はプログラムをバックグラウンドで動かすためのものです。「&」をつけると、実行直後にプロンプトが戻ってくるので、すぐに次のコマンドを入力することができます。
これをやらないと、「click.sh」の実行がすべて終わった後にLocalUIFlowを起動することになってしまいます。つまり、「13秒待ち、マウスを移動して、クリックする」動作が完了してから「LocalUIFlowを起動する」ことになります。これでは意味がありません。
「click.sh」を実行してすぐに「LocalUIFlowを起動する」動作に入って欲しいのです。LocalUIFlowが起動し終わるまで10秒ほどかかりますが「13秒待ち、マウスを移動して、クリックする」スクリプトが並列で実行されることで、起動後に「Start」ボタンが押されてLocalUIFlowが動作を開始します。
動作確認
あとは、起動時に正常に動作するか確認すればOKです。
手元の環境では今までの「LocalUIFlowの自動起動」の後に、「Start」ボタンを自動でクリックする動作を確認することができました。
これにて、「コンセントを繋ぐだけで、使用できる状態になるLocalUIFlowサーバー」が実現できました。
終了時
正しい手順は、LocalUIFlowのGUIから、「Stop」ボタンを押し、「スタートメニュー(ラズベリーマーク)」から「ログアウト」→「Shutdown」で終了し、コンセントを抜きます。それをするためにもタッチパネルにしました。
そうです。そのためのタッチパネルだったのです。……ですが、本当によくないのですが、
実際の授業では、コンセントを抜いて電源を落としています。
我ながら最低です。いや、最初のうちは、正しい手順で終わっていたのですが、授業が混んでくると、そんな悠長なことしていられないのです。
と、これでなんと、「コンセントをつないで授業を開始し、コンセントを抜いて終わる」という理想的な環境ができました。
……というわけで、オススメするわけではありませんが、この運用で一応、今のところ壊れてはおりません。最悪、microSDカードを複製してあるので、RaspberryPi 4自体が壊れなければ、カードを差し替えればなんとかなるかな…と思っています。