ラズベリーパイをweb経由で遠隔操作 その2

3年ほど前に書いたラズベリーパイをweb経由で遠隔操作するという記事にアクセスが多いようなのでpart2を書きました

当時はラズパイやpythonを始めたばかりということもあって、Apacheを導入してPHPと連携するという少し遠回りな方法を取っていました

今回はもっと簡単に、作成済みのプログラムにwebサーバー機能を搭載して遠隔操作できるようにしてみたいと思います

Flaskのインストール

今回はpythonで簡単にwebサーバーを実装できるFlaskというライブラリを使用します

ラズパイのターミナルを開き次のコマンドを入力してFlaskをインストールします

pip install flask

既存のプログラムに追記

ライブラリをインポートします

次のコードをプログラムの先頭に記述します

from flask import Flask             # Flaskのインポート
import threading                    # マルチスレッド用

次にwebサーバーとしての動作を記述します

メイン処理でFlaskを動かしてしまうとプログラムが停止してしまうので、関数化して新しいスレッドとして実行するようにします

以下は自作の温度制御プログラムにhttp://192.168.1.XX:5000/user/commandの形で外部からアクセスする場合のコードです(重要な部分は、最初の6行と最後の1行だけ)

def flask_thread():
    USER = "user"
    app = Flask(__name__)

    @app.route('/<user_name>/<command>')
    def index(user_name, command):
        if user_name != USER:
            return "Don't Access!"
        if command == 'tamago': # 温泉卵の温度制御を開始する
            ReadTemperProcess('temper_onsen_tamago.csv') # 工程を読み込む
            OnFileButton(1)     # スタートボタンを押す
        elif command == 'stop': # 制御を停止する
            g.start = False
        elif command == 'ondo': # siriが読み上げる温度のテキストを返す
            return "電気ケトルの温度は、" + str(g.temper) + "℃です"
        elif command == 'jikan': # siriが読み上げる残り時間のテキストを返す
            if len(g.list_dt_sv) == 0 or g.start == False:
                return "現在、停止中です"            
            msg = ""
            if g.file_name.find("onsen_tamago") is not None:
                msg = "。ただいま温泉卵を調理中です。"
            
            # 残り時間の計算
            rt = g.list_dt_sv[len(g.list_dt_sv)-1] - g.now_time
            s = rt.total_seconds()
            hours, remainder = divmod(s, 3600)
            minutes, seconds = divmod(remainder, 60)
            if int(hours) == 0:
                return "温度工程の残り時間は、" + '{:02}分{:02}秒です'.format(int(minutes), int(seconds)) + msg
            else:
                return "温度工程の残り時間は、" + '{:02}時間{:02}分{:02}秒です'.format(int(hours), int(minutes), int(seconds)) + msg
            
        return ""
    app.run(host='0.0.0.0', port=5000)

ごちゃごちゃ書いていますが、必要なのは最初の6行と最後の1行だけで、それ以外の部分はコマンドに応じた処理を書いています


最後に、メインプログラムの初期化の後に次のコードを記述します

th = threading.Thread(target=flask_thread)        # Webサーバースレッド
th.start()

これでプログラム実行時にwebサーバー用のスレッドが実行されます

このプログラムの実行後、ブラウザにURL(http://192.168.1.XX:5000/user/command)を入力してラズパイにアクセスすると、コマンドに応じた処理が実行され、ブラウザ画面にreturn の中身が表示されます

たったこれだけで既存のプログラムに、web経由で遠隔操作する機能を追加することが出来ました。

番外編: Siriを使って遠隔操作する

iPadやiPhoneには“ショートカット”という、強力なマクロ機能があります

Webページを開いたり、音楽を再生したり、カメラやセンサーなどを操作したり、振動させたりと、本体の持つ機能を連続的に実行することができます

作成したマクロはSiri経由で実行することも出来ます

“Hey Siri、部屋消灯” → ラズパイのURLにアクセス → リレーOFF

といった事が可能です

ここでは、先ほどのラズパイのURLにアクセスして、取得したテキストを読み上げさせてみます

iPadのショートカットを起動し、上部の+ボタンを押してマクロを追加・作成します

マクロ作成画面が開いたら、右側のコマンド一覧から

Web → Webリクエスト → URLの内容を取得、を選択

項目が追加されたらエディットボックスに先ほどのラズベリーパイのURLを入力します(http://192.168.1.XX:5000/user/command)

次に右側のコマンド一覧から

書類 → テキスト → テキストを読み上げる、を選択

すると自動で”URLの内容”を読み上げるに設定されます

最後に、一番上のエディットボックスにマクロのタイトルを入力します

このタイトルが音声起動するときのキーワードになります

ここでは、「現在の温度は?」にしました

家には7台のラズパイのうち、2台を低温調理用と電気毛布用に使っています(七人のラズパイ!)

その2台にSiriからアクセスして、現在の温度を読み上げさせてみます(地声はカット)

こんな感じで、ラズパイの遠隔操作 & 状況取得を行うことができました

これを応用すれば色んなことが出来そうですね(ワクワク

おすすめ

1件の返信

  1. 2022年11月29日

    […] 次回記事を書きました(2022/11/29) […]

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です