GUI(グラフィカルユーザーインターフェース)からボタン一発でコマンドを実行できるようにして、といった謎要求を突きつけられた人はいませんか?初心者ほどボタン一発で!と要求してきたりしますが、実際にそれを実現しようとするとなかなか面倒です。今回は、その面倒なことを少しでも実現してみようという試みです。試みですのでセキュリティ的によくない部分もあります。これに関しては問題があるとしても試みということで読んでもらえばと思います。
さて、GUIボタンでコマンドを実行するために今回はNode-REDを利用します。Node-REDはGUIでプログラムを作ることができるソフトウェアです。WindowsやMac、Raspberry Piなどで利用することができます。プログラムを作成するGUIはWebブラウザを使うため、環境を問わずプログラムを組み立てることができます。Node-REDに関しては歴史もあり多数の書籍や情報が公開されています。
今回はRaspberry Pi 5にNode-REDをインストールし、そこにmacOS+Google Chromeの組み合わせで利用することにします。もちろんWindowsやmacOS上にNode-REDが動く環境を構築しても構いません。
Raspberry PiにNode-REDをインストール
まずベースとなるRaspberry PiにNode-REDをインストールします。以前のRaspberry PiのOSにはNode-REDは標準で入っており、GUIメニューから実行することができました。もし、うまくインストールができなかった場合はRaspberry Pi 3Bなどに古い32bit版OSを入れて実行してもよいかもしれません。(この場合、以後に説明するものが動かない可能性もあります)
まず、以下のWebサイトにアクセスします。
Node-RED User Group Japan(Raspberry Piで実行する)
https://nodered.jp/docs/getting-started/raspberrypi
ページ内に以下のスクリプトがあります。これをコピーしてからRaspberry Piのターミナルにペーストしリターンキーを押します。
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
しばらくするとYes/Noを訪ねてくるのでyを押してからリターンキーを押します。
すると次にRaspberry Pi用のノードを入れるかどうか聞いてきます。yキーを押してからリターンキーを押します。
インストールの進捗状況が表示されます。
環境によってはこのまま終了する場合もあります。以後のように設定を続ける場合が出てきたらリターンキーを押して進めて行きます。なお、ユーザー名とパスワード部分は入力する必要があります。
インストールが終了したら以下のようにコマンドを入力します。Node-REDがインストールされていればバージョン等の情報が表示されます。
node-red --version
Node-REDの起動とブラウザからのアクセス
それではNode-REDを起動してみましょう。と、その前にRaspberry PiのIPアドレスを確認しておきましょう。というのも今回はRaspberry Pi上でプログラムを作成するのではなくmacOSからアクセスするためIPアドレスを知る必要があるためです。以下のようにコマンドを入力します。
ifconfig | less
使用するRaspberry Piはローカルネットワーク内にあり無線LANで接続されています。wlan0がWiFi接続するネットワークインターフェースになります。この部分にIPアドレスが記載されています。今回の場合は、192.168.11.52がIPアドレスになります。
IPアドレスを確認したらNode-REDを起動します。以下のように入力します。しばらくすると表示されるメッセージが止まりNode-REDが起動します。
node-red-start
なお、Node-REDをRaspberry Pi上で動作させたい場合はIPアドレスは調べなくてもブラウザを起動し以下のようにアドレスを入力します。
http://localhost:1880/
macOSなどからアクセスする場合はWebブラウザ (Google Chrome/Safari) から以下のように入力します。
http://192.168.11.52:1880/
入力するとユーザー名とパスワードを聞いてくる場合があります。図6で入力したユーザー名とパスワードを入力します。
起動すると図のような画面になります。新機能等の説明は必要なければ×ボタンをクリックしてダイアログを消してしまっても構いません。とりあえず、これでNode-REDでUNIXコマンドを実行する用意ができました。
シンプルなプログラムを作成
それではシンプルなプログラム(フロー)を作成してみます。ここではタイムスタンプをデバッグメッセージサイドバーとUNIXのターミナル(Raspberry Pi側)に表示します。
まず、左側の共通のカテゴリからinjectのノード(ブロック)を右側のマス目が表示されている領域にドラッグドロップします。ドラッグドロップするとノード内の表示がタイムスタンプに変わります。
次に共通のカテゴリからdegugのノードを先ほどと同様にドラッグドロップして配置します。
次にタイムスタンプと表示されているノードの右側にある□の上でマウスの左ボタンを押したままdebug 1と表示されているノードの左側の□上まで移動します。マウスボタンをはなすと2つのノードが連結されます。
これでプログラムの骨格はできあがりです。ただし、この状態ではプログラムは動作しません。実際に動作するプログラムにするには右上にある赤くなっている「デプロイ」と書かれたボタンをクリックします。エラーなくデプロイされるとプログラムが実行されます。
プログラムは実行されていますが、この状態ではデバッグメッセージサイドバーには何も表示されません。このプログラムは動作していますが、トリガーとなるアクションを起こさないといけません。今回の場合はタイムスタンプと書かれたノードの左側の四角い部分をクリックします。するとデバッグメッセージサイドバーに現在のタイムスタンプが表示されます。
Raspberry Piのターミナルに表示
それでは次にタイムスタンプをRaspberry Piのターミナルに表示してみましょう。debug 1と書かれたノードをダブルクリックします。すると設定画面が表示されます。この画面で「システムコンソール」の部分にチェックを入れます。チェックを入れたら「完了」ボタンを押します。あとはデプロイしてプログラムを実行します。
先ほどと同様にタイムスタンプと書かれたノードの左側の□をクリックします。するとデバッグメッセージサイドバーに現在のタイムスタンプが表示されます。そして、Raspberry Piのターミナルにも同様にタイムスタンプの値が表示されます。
echoコマンドを実行
次に本来の目的であるUNIXコマンドを実行してみましょう。まず、タイムスタンプのノードとdebug 1のノードを繋いでいる線をクリックします。deleteキーを押して削除します。これでノード間の連結が解除されます。
次にechoコマンドを実行するためのノードを配置します。機能のカテゴリにあるexecをドラッグドロップして配置します。
配置したらタイムスタンプのノードとexecのノードを繋ぎます。次にexecのノードとdebug 1のノードを繋ぎますが、execのノードの右側には□が縦に3つ並んでいます。これは標準出力、エラー出力、リターンコードを示しています。今回はechoで文字を表示するだけなので一番上の標準出力を示す□とdebug 1のノードを繋ぎます。
次にexecノードのブロックをダブルクリックします。すると設定画面が表示されます。
設定画面のコマンドの欄に実行するコマンドとパラメーター(引数)を入力します。ここでは以下のように入力しました。入力したら「完了」ボタンをクリックします。
echo 'Raspberry 3.14'
右上のデプロイボタンをクリックします。このデプロイボタンをクリックしないと以前のプログラムが実行されたままになります。変更を加えたら必ずデプロイボタンを押しましょう。
デプロイしたらタイムスタンプのノードの左側の□をクリックして実行します。実行するとデバッグメッセージサイドバーとRaspberry PiのターミナルにRaspberry 3.14の文字が表示されます。echoコマンドが実行されたことになります。
echoコマンドでは本当に実行されたかどうか怪しいなと思う人がいるかも知れません。今度はechoではなくlsコマンドを使ってRaspberry Piのディレクトリ内容を表示してみましょう。先ほどと同様にexecのノードをダブルクリックして設定画面を表示します。コマンドの欄にls -laと入力します。入力したら完了ボタンをクリックします。これまでと同様にデプロイボタンをクリックします。
デプロイしたらタイムスタンプのノードの左側の□をクリックして実行します。実行するとデバッグメッセージサイドバーとRaspberry Piのターミナルにカレントディレクトリの一覧が表示されます。lsコマンドが実行されています。