Node-RED+UIFlowでノンプログラミングをして、フリーズしたPCを再起動するプログラムを作る


初めに

環境

  • クライアント側
    • Windows 10
    • Atom Lite
    • Unit Relay
  • サーバー側
    • Node-REDを実行しているWindows Server
    • UIFlowというサービス

手段

環境構築

M5burner

  • M5burnerをダウンロードしUIFlowのファームウェアを書き込む
    • 左側のデバイス一覧からATOMを選ぶ
    • 上のCOMポートからatom liteに該当するものを選ぶ
      • 判別にはデバイスマネージャーのポート(COMとLPT)を開いた状態でatom liteを抜き差しし、消えたり現れたりするCOMポートを選ぶ
    • (LEDマトリクスのついていない)Atom Liteの場合はUIFlow(Lite)を書き込む(Burn)
    • WiFiのSSIDとPWを入力
    • 書き込み後、Burnの横のConfigurationを開くとUIFlowからプログラムを書き込むのに必要なApi Keyが得られる

UIFlow

  • UIFlowにアクセスする
    • ポップアップが出てくるので、Atom Liteとrelayの組み合わせを選ぶ。Api Keyには先ほど得た値を入れる。
    • 入力を終えると(おそらく)Atom LiteがWiFi経由でM5stackのサーバーにつながり、ブラウザからプログラムを書き込むことが可能になる。

Node-RED

  • インストール手段はこのページで説明したため、省略する。
  • windows serverでMQTTブローカーを開くため、MQTTで用いるポートを開く
    • ファイヤーウォールの詳細設定で可能
    • デフォルトは1883(一応変更推奨)、プロトコル:TCP
  • Node-RED上では私の環境では原因不明なエラーによりノードのインストールができないため、サーバーのターミナル上でnode-red-dashboardnode-red-contribute-aedesをインストールする。
npm i node-red-dashboard node-red-contribute-aedes

プログラム作成

UIFlow上(Atom Lite)

  • MQTTブローカー(Windows ServerのNode-RED内)の設定
    • IPアドレスとポートは適宜設定
  • デバッグ用のMQTTパケット送信部
    • 再起動するというMQTTパケットを収得し、リレーを正常に作動させることができた場合、successというMQTTパケットを送る
  • リレーの動作
    • リレーをつなぎ、一定時間がたった後にリレーを切る
    • リレー作動中はRGBを交互に点灯する
  • 再起動のMQTTパケットを受け取る部分
    • もしパケット中のreboot要素がtrueの時のみ再起動する
    • 最初にリレーを5秒間作動させてPCを強制終了
    • 1秒待った後、リレーを2秒間作動させて起動する。
  • 実行ボタンはプログラムを揮発性の領域に入れるため、電源を外すと消えてしまう。したがって、最終的にプログラムを書き込む際にはダウンロードのボタンを押す。

Atom Liteのデバッグ

  • 下の画像に示すようなRemote+要素を用いることによってブラウザからAtom Lite内の変数の値の確認ができる

Node-RED上

  • 下画像のDashboardをクリックした後 配置で新しいタブを作り、その中に新しいグループを作る。
  • 画像を参考にフローを作る
    • 書いてある名称は任意に変更できるので、アイコンを目印に対応するノードを探す。
  • 設定内容(デフォルトのままの場合は記載なし)

    • mqtt in
      • サーバー: localhost:1883
      • トピック: pc1_debug
      • 出力: 文字列
    • text
      • Group: 先ほど作ったグループを選択
    • button
      • Group: 先ほど作ったグループを選択
      • payload: {"reboot": "true"}
      • Topic: pc1
    • mqtt out
      • サーバー: localhost:1883
  • デプロイするとdashboardにボタンが生成される。下画像の右上のアイコンをクリックして、異なるタブで内容を確認する。

  • 下画像のようなボタンが現れているはずである。

    • REBOOTを押すと、{"reboot":"true"}という文字が表示され、リレーが2回オンオフされる。その後、successという文字列が現れる。

動作

  • 出力
    • Node-RED dashboardのボタンが押されたとき、再起動を指示するMQTTパケットがNode-RED MQTTブローカーから出される。これをAtom Liteが受け取り、再起動を実行する。
  • 入力
    • 再起動後、Atom Liteはsuccessという文字の入ったMQTTパケットをNode-RED MQTTブローカーに送る。これがNode-RED dashboardに表示され、ユーザーは再起動が成功したことを確認することができる。

MQTTのデバッグ

  • スマートフォンのアプリストアでmqttと検索すると、MQTTパケットの送受信ができるアプリが出てくる。これを用いることでMQTTパケットが正常に出されているかを確認することできる。

Note

  • Atom LiteのLEDがつかなくなることが頻繁にあった
    • 原因はアップロードしたpythonプログラムにバグがあったこと
    • M5BurnerのConfigurationでApp modeからUSB modeに戻すと再びLEDがついた
      • App modeはAtom Liteのフラッシュメモリ中のPythonプログラムを実行する
      • Internet modeはオンラインのUIFlowでプログラミングするモード
        • 起動後、LEDは赤色に点灯する。(おそらく)Wifi接続が完了すると緑色に点灯する
      • USB modeはオフライン(PC)のUIFlowでプログラミングするモード

参考リンク

https://qiita.com/youtoy/items/17739b7f4197a8d3fa4d
https://raspberrypi.mongonta.com/howto-use-uiflow-with-m5atom/
https://www.1ft-seabass.jp/memo/2018/05/10/m5stack-meets-nodered-with-mqtt/
https://note.com/ogkt/n/na459421865d6-