Node-RED RaspberryPi Windows

AlexaとNode-RED【応用編】

投稿日:

次はAlexaからWindowsPCを操作します。

LAN経由でWindowsPCに何か任意のプログラムを実行させるのはセキュリティの問題で、実は意外とめんどくさかったりします。

なのでMQTT経由でWindowsPCに指示を送り、インストールされたEventGhostというプログラムが指示を受け取りアクションを起こす、という形で実現します。
言うなればEventGhostは特大のセキュリティホールを開ける獅子身中の虫、という感じですね(例えが悪い)

MQTTとはIoT関連で生まれた極軽い通信システムで、送り側はサーバーにトピック(チャンネルや掲示板のスレッドみたいな概念)をポストし、受け側は自分でサーバーに見に行く、という形で情報をやり取りする掲示板みたいなものです。

 Publisher(送信者)→Bloker(処理サーバ)←Subscriber(受信者)

この場合はRaspberryPiがBloker、Node-REDがPublisher、EventGhostがSubscriberになります。
例によってWindowsPCだけでも可能だったりすると思います。

RaspberryPiの準備
MQTTのBlokerをインストールする

sudo apt install -y mosquitto

インストール後Blokerはサービス起動するはずですが一応確認します。

sudo service mosquitto status

緑色の「active (running)」という文字があればOKです。

・CUIでの動作確認
極力余計なものをインストールしたくない、という方は後述のNode-REDでの動作確認だけでいいと思います。
実際の運用ではクライアントは使いませんが、動作確認の為一応インストールします。

sudo apt install -y mosquitto-clients

2つコンソールを開いておいて片方でPublisher、もう片方をSubscriberとして適当な文字列を送ってみます。

受信側:

mosquitto_sub -h localhost -t tp1/test

このプログラムはループ受信待機しているのでctrl+Cで中断するまで処理が戻ってきません。
ホストアドレスが「localhost」トピックが「tp1/test」です。

送信側:

mosquitto_pub -h localhost -t tp1/test -m displayoff

で起動して、適当な文字列を打ち込んでEnter。
受信側に打ち込んだ文字列が表示されればOKです。

・Node-REDでの動作確認
まず受信側を作成しますので左側パレットの入力欄にあるMQTTとdebugを配置し線を繋ぎます。

配置したMQTTをダブルクリックしサーバ欄の鉛筆マークボタンをクリックして

新規ノードの追加で「サーバ」欄にBlokerサーバのアドレスを記入します。
今回は自分自身がBlokerサーバですから「localhost」です。
一応Port欄も同じ番号であることを確認してください。
名前欄は適当でOKです。
決定ボタンを押してMQTTの設定に戻ったら、サーバに先ほど入力した名前が選択されていることを確認してトピックに適当な文字列を設定します。

次に送信側を作成します。
左側パレットの出力欄にあるMQTTとinjectを配置し線を繋ぎます。

MQTTの設定では先ほどの受信側と同じ文字列を入力しましょう。

injectをダブルクリックし、ペイロードを「文字列」とし適当な文字列を入れてみます。

デプロイ後、injectの左の突起部分をクリックして先ほどの受信側debugノードに文字列が到達していればOKです。

双方のBlockerサーバ(アドレス)とトピックが一致していないと伝わらない仕様になっています。

検索すると「[大区分]/[小区分]」の様にトピックを構成している例が多いのですが、特に決まりがあるわけでなく単に文字列として一致していればいいようです。

WindowsPC側の準備
EventGhostをインストールし、さらにMQTT Client Pluginをインストールします。
ちなみにデフォルトではインストールしたフォルダに設定ファイルを自動保存するので、C:\Program Files\以下にインストールすると終了時に毎回警告が出てしまいます。
別のところにインストールするか、最初に設定ファイルをマイドキュメントなどに新規作成してそちらを使うのがお勧めです。

EventGhostの自動実行(オートスタート)に
プラグイン:MQTT Client
アクション:Start a new MQTT subscription
を追加し
ホスト(Bloker、今回はRaspberryPiのIPアドレス)とトピックを設定、「Check to include payload in event string」にチェックを入れます。
チェック無しだとpayloadをチェックしないのでトピックが同じだと受信してもメッセージの区別がつきません。

MQTT Subscriber nameはなんでもいいです。
Port numberは弄る必要が無いと思いますが、一応RaspberryPi側と一致しているか確認しましょう。

これでトピックが合致していればメッセージを受け取れるようになります。

画像のメッセージは私が実際に運用しているモニタをOffするフリーソフト起動のイベントです。

なおEventGhostがフリーズするなどちゃんと動かない場合はここから「with Paho」バージョンをDLして、アーカイブ内のpahoフォルダをEventGhostの/lib26/site-packagesフォルダにコピーします。
※プラグイン作者個人のgoogleドライブアカウントのようです。

MQTT送信と連動設定例
Node-REDのパレットからinjectとMQTT(送信)を配置し、線を繋ぎます。

MQTTノードをダブルクリックし、サーバとトピックを設定します。

payloadに値を設定するには、前回と同じくtemplateノードを使います。
パレットから線の途中にドラッグアンドドロップすると自動的に挿入になりますので、ダブルクリックして値を設定します。



今回は「test」としてます。

デプロイしたのち、injectの左の突起をクリックするとメッセージが送信されます。
EventGhost側で受信出来ているかどうか確認しましょう。

EventGhostはかなり強力なツールで、設定次第で割となんでもできます。
例としてメモ帳を起動してみましょう。

EventGhostで「設定」「マクロを追加」もしくはボタンからマクロを追加します。

MQTTのメッセージをイベントへのトリガーにするには一度メッセージを送り、ログからドラッグ&ドロップします。
今回は先ほどのメッセージを利用します。

次に「アクションの追加」で「追加するアクションを選択」ダイアログを表示して「アプリケーション開始」を選択し「OK」
「Action Item Settings」ダイアログでメモ帳を設定します。

さらに「名称変更」もやるとこうなる筈です。

ではNode-REDからもう一度先ほどのinjectをクリックしてメッセージを送ってみます。
メモ帳が起動したと思います。

なお今回の運用では使用しませんが、動作確認で使ったようにEventGhost側からも アクション:Publish a MQTT message でメッセージの送信が可能です。

これでEventGhostに可能な事なら何でもPCに実行させることができるようになりました。
ベッドに入ってから「あ、PCまだ起動してた」なんて時にもAlexaから音声で終了したりモニタをオフできるわけです。
ええ、よくやるんですyo…

VRゴーグルを被った状態でマウスやキーボードの操作は難しいのですが「アレクサ、俺の嫁を召喚して!」でカス○ムメ○ド3D2を起動するというのもアリだと思います。
夢が広がりますね!

余談ですが。
私は後から知りましたがNode-RED上で動作するBlockerもあり、そちらを利用したほうが簡単かもしれません。
逆にインターネット上でサービスしているリッチなBlockerもあり、有料ですがAmazonも提供していますし無料のサーバーもあるようです。
それらを使えば外出時にスマホから自宅のRaspberryPiやPCにMQTTメッセージを送って何かさせる、ということも可能になります。
Alexaアプリでもほぼ同じことが出来るので私は試していませんが、アイデア次第では面白いかもしれません。

-Node-RED, RaspberryPi, Windows
-, ,

Copyright© 復活の「愛馬の上で直立不動」 , 2021 All Rights Reserved Powered by STINGER.