こんにちは。
今回はガレージのIoTでシャッターの開閉をスマホから操作できるようにしようということがやりたいことになります。
構成としてはFlaskウェブサーバーとESP32のSocket通信で制御しています。
あまり同じ構成を見なかったので参考になればと思います。
背景
今回のIoTの背景としては友人と共同で契約しているガレージがリモコンはあるのですが、反応が悪いし忘れることもあるので、いつも必ず持っているスマホで開閉できるようにしたいからです。
全体システム
全体システムは以下のようになっています。
ユーザー操作順に説明すると
- スマホからFlaskサーバーのサイトへアクセス
- シャッター開閉ボタンを押してHTTPリクエストをサーバーへ送信
- Flaskサーバーが別スレッドのSocket通信サーバーへQueueで受け取った制御指令を送信
- SocketサーバーがESP32に制御信号をSocketで送信
- ESP32がGPIOでシャッターを制御
といった流れになります。
良いところは、ESP32側で面倒な固定IPやポート変換等の心配をしなくていいことになります。
サーバーを持っていることが前提になりますが、私はKagoya VPSを契約しているので、その固定IPサーバーを有効活用します。
実装
早速実装ですが、まずサーバー側のPythonの実装です。
Flaskサーバーの機能とThreadingでSocket通信のサーバーを起動しています。
Socket通信サーバー側の実装はこちら。
単純にQueueで受け取った指令を繋いでいるESP32に送っています。
最後にESP32側の実装です。
基本的には受け取ったSocketメッセージに応じて制御します。
その他の細かいhtml等は以下のレポジトリをご参照。
(だいぶアップデートしてしまっているかもしれませんが。)
GitHub - Aki-R/shutter_control_server
GitHub - Aki-R/garage_shutter: シャッター開閉するやつ
テスト
スマホからの操作画面はこんな感じです。
一旦、直接ガレージのシャッターではなくLEDライト点灯でテストします。
デプロイ(ガレージ実装)
あとはガレージのシャッター制御回路に実装するだけです。
GPIOからのリレー制御にはこちらのボードを使いました。
サインスマート(SainSmart) 5V リレーモジュール for Arduino DSP AVR PIC (4チャンネル)
実装完了です。
課題
最後に少し課題がありまして、長時間接続しているとESP32がClinet.Connected()がTrueのまま、実際は接続が切れているという不具合があります。
なのでESP32側を再起動すると復活するのですが、詳細は解析中。
対策としては制御信号がなくても定期通信するようにするとかですかね。
以上、ガレージIoT化でした。