NoCode で遠隔から操作できるスマートホームデバイスを開発してみた
飯塚 将太
こんにちは、IoT ソリューションアーキテクトの飯塚です。
本記事では、入手しやすいデバイスを用いて、コードを一行も書かずに、クラウドから操作できるスマートホームデバイスを開発してみようと思います。
今回作成する構成は非常にシンプルです。
スマートホームデバイスとしては、Raspberry Pi を用います。この Raspberry Pi に AWS IoT Greengrass Core Software をインストールし、Greengrass コネクタ と呼ばれるものを設定します。今回は Greengrass コネクタの中の Raspberry Pi GPIO コネクタを利用します。このコネクタを利用することで、簡単な設定とメッセージの送信のみで Raspberry Pi の GPIO を操作することができます。またメッセージはクラウド経由で送信できるため、遠隔からデバイスを制御できます。このように遠隔から制御できるスマートデバイスを、コードを一行も書くことなく簡単に開発できます !
必要な作業は以下となります。またこれらの手順で作業する箇所を図に示します。
ご注意
本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。
このクラウドレシピ (ハンズオン記事) を無料でお試しいただけます »
毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。
1. 使用するハードウェアの準備
今回の構成を実現するためにRaspberry Piは必須ですが、その他はお好きなものをまたは必要に応じでご用意ください。
- Raspberry Pi (Raspberry Pi 3 Model B+ で動作確認しています)
- AWS IoT Greengrass のインストール要件を満たすモデルをご用意ください。AWS IoT Greengrass のインストール要件はこちらになります。また動作に必要な電源や SD カードも併せてご用意ください。
- AWS IoT Greengrass のインストール要件を満たすモデルをご用意ください。AWS IoT Greengrass のインストール要件はこちらになります。また動作に必要な電源や SD カードも併せてご用意ください。
- 制御対象のデバイス
- Raspberry Pi の GPIO の High/Low のみで制御できるものをご用意ください。High/Low のみで制御できるものであれば、なんでも構いません。私は電球を用意しました。
- Raspberry Pi の GPIO の High/Low のみで制御できるものをご用意ください。High/Low のみで制御できるものであれば、なんでも構いません。私は電球を用意しました。
- (必要に応じて) 機械式リレー基板
- 私は上記のように制御対象のデバイスとして電球を用いました。Raspberry Pi の GPIO では電源系統を直接制御できないため、こちらの機械式リレー基板を用意しました。本製品は Raspberry Pi 用なので、ハットとして GPIO ピンアレイに挿し込むだけで良いので便利です。
- 私は上記のように制御対象のデバイスとして電球を用いました。Raspberry Pi の GPIO では電源系統を直接制御できないため、こちらの機械式リレー基板を用意しました。本製品は Raspberry Pi 用なので、ハットとして GPIO ピンアレイに挿し込むだけで良いので便利です。
- (必要に応じて) 工具
- 配線の被覆を剥く工具やニッパー
- リレー基板の端子を回す小型のマイナスドライバー
2. ハードウェアのセットアップ
ここでは、電球を機械式リレーで制御する際の電気的な結線について説明します。
まず、リレー基板と Raspberry Pi を接続します。上記の製品であれば、Raspberry Pi の GPIO ピンアレイにハットとして挿し込むだけです。それ以外のこのようなリレー基板をお持ちの方は、ジャンパーワイヤーなどでリレー基板のピンと Raspberry Pi の GPIO ピンを接続してください。その際にはリレー基板の電源や GND ピン、そして信号線をそれぞれ Raspberry Pi のピンアサインに従って接続する必要があります。
次に、下の図のようにリレー基板と操作対象機器、そして電源を接続してください。リレー基板に書かれているオレンジ色の線は、信号が Low の際のスイッチの向きを表しています。信号の High/Low というのは信号の電圧レベルのことを指します。High が電圧が高く、Low は比較して電圧がほとんどない状況のことを言います。
今回は信号が Low の際には操作対象機器は OFF になっていて欲しいので、図のように 1 つのリレーに対して 3 つある端子のうち、スイッチングされる中央の端子と、現在接続されていない下の端子に配線を接続し、スイッチが切れている状態にします。またリレー基板の端子の多くは、小さいマイナスドライバーを使用して回転させることで、配線を簡単に接続できます。
実際にリレー基板に接続した様子がこちらです。
3. Raspberry Pi のセットアップと動作確認
OS は Raspberry Pi OS (32-bit) with desktop もしくは Raspberry Pi OS (32-bit) with desktop and recommended software をインストールしてください。Lite 版だと利用したい一部のソフトウェアがインストールされていないため、自身でインストールする必要があります。Raspberry Pi のセットアップ方法はこちらのドキュメントに記載があります。
Raspberry Pi を起動し、有線もしくは無線によるインターネットへの接続も行ってください。
次に Raspberry Pi のターミナルを起動して動作確認を行っていきます。SSH によるリモート接続でも OK です。
また今回操作する Raspberry Pi の GPIO ピンの番号を確認しておいてください。用意したリレー基板で前ステップの写真のように接続した際には 4 番ピンに繋がっているので、下記のコマンドを実行してください。ピン番号については適宜読み替えてください。
まずは操作対象のピンを Output モードに設定します。そのためには下記のコマンドを実行します。4 がピン番号となります。$ はプロンプトなので入力は不要です。
$ gpio -g mode 4 out
次に下記のコマンドで、現在のピンの状態を確認してみます。
$ gpio -g read 4
デフォルトでは、Output ピンは電圧が Low つまり 0 になっているはずです。
では実際にピンを操作して、このピンの状態を High、つまり 1 に変更してみます。下記のコマンドで実行できます。末尾の 1 が High を表しています。
$ gpio -g write 4 1
実行後に操作対象機器が操作できていれば成功です。私の場合ですと、電球が点灯しました ! 操作できない場合には、配線が正しいか今一度確認してみてください。
またピンの状態を Low、つまり 0 に戻すにはこのようなコマンドを実行します。末尾の 0 が Low を表しています。
$ gpio -g write 4 0
OFF にできたでしょうか。このようなコマンドを実行することで、簡単に GPIO ピンを操作できます。このあと実施するクラウドから操作できない場合には、このコマンドを実行することで、配線や Raspberry Pi に問題がないことを簡単に確認できます。
ここまでの手順で、Raspberry Pi を用いて機器を操作できるようになりました。しかしこのままでは Raspberry Pi にアクセスできる環境からしか機器を操作できません。そこで次のステップからクラウド経由で遠隔から操作できるように改良していきます。そのためには AWS IoT Greengrass を用いますが、今回はこのクラウド経由の操作もノンコーディングで実現できます !
4. AWS IoT Greengrass のインストール
では次に AWS IoT Greengrass をインストールを行っていきます。今回はこちらの手順で紹介されている、AWS IoT Greengrass のセットアップスクリプトを用いることで、簡単かつ迅速に AWS IoT Greengrass をインストールし、セットアップしていきます。その他の方法で AWS IoT Greengrass をインストールしクラウド上に AWS IoT Greengrass グループを作成できる方は、この方法でなくても構いません。
ここでの必要な手順は以下です。
- AWS の認証情報の発行
- AWS IoT Greengrass のための初期設定
- 再起動
- AWS IoT Greengrass のインストール
まずは、AWS の認証情報を発行しておいてください。このステップで利用するので、コピーしておきましょう。
次に下記のコマンドを実行し、セットアップスクリプトによって AWS IoT Greengrass のための初期設定を行っていきます。このスクリプトでは途中イントラクティブに入力を求められるので、それも行っていきます。
$ wget -q -O ./gg-device-setup-latest.sh https://d1onfpft10uf5o.cloudfront.net/greengrass-device-setup/downloads/gg-device-setup-latest.sh && chmod +x ./gg-device-setup-latest.sh && sudo -E ./gg-device-setup-latest.sh bootstrap-greengrass-interactive
- アクセスキーとシークレットアクセスキーの入力が求めらるので、先程コピーした値をペースト
- トークンについては、一時認証情報を用いている場合には入力してください。そうでない方は Enter キーを押してスキップ
- リージョンは AWS IoT Greengrass が使用できるお好きなリージョンを入力。東京リージョンであれば、ap-northeast-1 と入力
- Group や Core の名前は RaspberryPi とします。スペースは無しで入力
- Hello World Lambda Function は今回必要ないので、no と入力
- その他はデフォルト設定のままで良いので、Enter キーを押す
実行結果の例を下記に示します。
############### Greengrass Device Setup v1.0.3 ###############
[GreengrassDeviceSetup] The Greengrass Device Setup bootstrap log is available at: /tmp/greengrass-device-setup-bootstrap-1602720865.log
[GreengrassDeviceSetup] Using package management tool: apt-get...
[GreengrassDeviceSetup] Using runtime: python3.7...
[GreengrassDeviceSetup] Installing a dedicated pip for Greengrass Device Setup...
[GreengrassDeviceSetup] Validating and installing required dependencies...
[GreengrassDeviceSetup] The Greengrass Device Setup configuration is complete. Starting the Greengrass environment setup...
[GreengrassDeviceSetup] Forwarding command-line parameters: bootstrap-greengrass-interactive
Enter your AWS access key ID, or press 'Enter' to read it from your environment variables.
XXXXXXXXXXXXXXXX
Enter your AWS secret access key, or press 'Enter' to read it from your environment variables.
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Enter your AWS session token, which is required only when you are using temporary security credentials. Press 'Enter' to read it from your environment variables or if the session token is not required.
Enter the AWS Region where you want to create a Greengrass group, or press 'Enter' to use 'us-west-2'.
ap-northeast-1
Enter a name for the Greengrass group, or press 'Enter' to use 'GreengrassDeviceSetup_Group_b36ea75c-ffbf-49a1-86a3-9e753a69fccd'.
RaspberryPi
Enter a name for the Greengrass core, or press 'Enter' to use 'GreengrassDeviceSetup_Core_27b579e9-52ae-4708-9c3e-99c42f86a43c'.
RaspberryPi
Enter the installation path for the Greengrass core software, or press 'Enter' to use '/'.
Do you want to include a Hello World Lambda function and deploy the Greengrass group? Enter 'yes' or 'no'.
no
Enter a deployment timeout (in seconds), or press 'Enter' to use '180'.
Enter the path for the Greengrass environment setup log file, or press 'Enter' to use './'.
[GreengrassDeviceSetup] Validating the device environment...
[GreengrassDeviceSetup] Validation of the device environment is complete.
[GreengrassDeviceSetup] Running the Greengrass environment setup...
[GreengrassDeviceSetup] A reboot is required to make cgroups configuration change effective.
You must reboot your device manually and then restart GreengrassDeviceSetup.
初回のスクリプト実行では初期設定のみ実行され、上記のように最後に再起動してくださいとメッセージが表示され、スクリプトが終了します。
AWS IoT Grengrass のインストールにはここで再起動が必要となるので、以下のコマンドを実行し、Raspberry Pi を再起動させます。
$ sudo reboot
起動したら先ほどのコマンドを実行したディレクトリで、下記コマンドで再度スクリプトを実行します。
$ sudo -E ./gg-device-setup-latest.sh bootstrap-greengrass-interactive
- まず先ほどの設定内容を引き継ぐかどうか聞かれるので、yes と入力
- 再度アクセスキーとシークレットアクセスキーの入力が求めらるので、先程コピーした同じものをペースト
- トークンについては、一時認証情報を用いている場合には入力してください。そうでない方は Enter キーを押してスキップ
これらの入力が終了すると、AWS IoT Greengrass のインストールとクラウド上に AWS IoT Greengrass のリソースが作成されます。以下のように表示されていればこれらのステップは成功です。
Your device is running the Greengrass core software.
Your Greengrass group was created.
証明書や秘密鍵も発行されて、既にダウンロードされ使用できる状態になっています。手動で作成するよりも簡単ですね。既に Raspberry Pi 上で AWS IoT Greengrass Core Software も起動されており、使用できる状態になっています。
また、再起動などを実施した場合には AWS IoT Greengrass を起動しておく必要があります。手動で AWS IoT Greengrass を起動する場合は、以下のコマンドを実行します。
$ sudo /greengrass/ggc/core/greengrassd start
以上でこのステップの作業は終了です。次にクラウド上で AWS IoT Greengrass の設定を行っていきます。
5. AWS IoT Greengrass の設定
このステップでは、AWS マネージメントコンソール上で作業していきます。そのためまずは AWS マネジメントコンソールにログインしてください。ログインしたら必ず、画面右上のリージョンを確認の上、先程指定したリージョンと同様になるように変更します。
そして AWS Iot Greengrass のページを開き、左のサイドメニューからグループ一覧のページを開いてください。そして前のステップで作成した AWS IoT Greengrass グループを選択して開きます。私は RaspberryPi というグループ名にしていました。このグループに対して、下記 3 つの設定をしていきます。
- デバイスリソースの追加
- コネクタの追加
- サブスクリプションの追加
- デプロイ
今回使用する GPIO コネクタを利用するためには、Raspberry Pi の GPIO のデバイスリソースに AWS IoT Greengrass がアクセスできる必要があります。このリソースにアクセスできるよう明示的にデバイスリソースを追加します。その後そのリソースを指定してコネクタを追加します。またコネクタはメッセージによってトリガーされます。AWS IoT Greengrass やこのコネクタがメッセージ送受信できるためには、明示的にサブスクリプションを設定する必要があります。そこでコネクタが利用するトピックを明示的に追加します。
5-1. デバイスリソースの追加
今回は Raspberry Pi の GPIO を操作したいので、/dev/gpiomem をデバイスリソースとして追加していきます。
- 今回作成した AWS IoT Greengrass グループの左のサイドメニューからリソースを選択します。
- ローカルのタブを選んで、ローカルリソースの追加ボタンを押します。
- ローカルリソースの画面
- リソース名に分かりやすい名前をつけます。例えば GPIO などが適切でしょう。
- リソースタイプはデバイスを選択します。
- デバイスパスはデバイスファイルのパスを指定します。今回は /dev/gpiomem と入力します。
- グループ所有者のファイルアクセス許可 は リソースを所有する Linux グループの OS グループアクセス許可を自動的に追加 を選択します。
- その他の設定はそのままで、右下の保存ボタンを押します。
- リソースの画面
- 今作成したリソースが追加されているはずです。
- ステータスが関連なしになっていると思いますが、問題ありません
ローカルリソースの画面はこちらの画面のように設定してください。
クリックすると拡大します
これでコネクタが使用するデバイスリソースが追加されました。このままでは使用されないので、次にコネクタを作成し、そのコネクタにこのデバイスリソースを関連付けます。
5-2. コネクタの追加
- AWS IoT Greengrass グループの左のサイドメニューからコネクタを選択します。
- コネクタの追加ボタンを押します。
- コネクタの選択画面で、使用できるコネクタ一覧から Raspberry Pi GPIO を選択し、次へボタンを押します。
- パラメーターの設定画面
- リソースが選択されていませんと表示されている箇所をクリックし、デバイスリソースを選択します。/dev/gpiomem と 表示されている先ほど作成したデバイスリソースを関連付けます。私は GPIO というリソース名をつけていました。
- その下に GPIO ピンのモードを設定するボックスがあります。3 の動作確認時にも試したように、今回はピンへの出力を行います。そこで下部にある Output GPIO pins (オプション) のボックスに設定したいピン番号をカンマ区切りで入力します。今回は既に試したように、4 番ピンを使用するので、4 とだけ入力します。
- 右下の追加ボタンを押します。
- コネクタの画面
- 今作成したコネクタが正しく追加されているはずです
コネクタのパラメーターの設定画面では、こちらの画面のように設定してください。
クリックすると拡大します
さてこれでデバイスリソースを関連付けたコネクタを追加できました。
5-3. サブスクリプションの追加
しかしこのままではまだこのコネクタを起動させることができません。このコネクタを起動させるためには、特定のトピックに対して特定のメッセージを送信する必要があります。AWS IoT Greengrass やこのコネクタがメッセージ送受信できるためには、明示的にサブスクリプションと呼ばれる、メッセージの送信元と送信先、そのメッセージングに使用するトピックを設定する必要があります。そこでコネクタが利用するトピックを明示的にホワイトリストに追加します。
- AWS IoT Greengrass グループの左のサイドメニューからサブスクリプションを選択します。
- 右上のサブスクリプションの追加ボタンを押します。
- ソースとターゲットの選択の画面
- ここではメッセージの送信元と送信先を設定します。今回はクラウドからデバイス (コネクタ) を操作したいので、ソースにクラウドタブの IoT Core を、ターゲットに先ほど作成したコネクタタブの Raspberry Pi GPIO を選択します。
- ソースの選択の画面
- 選択ボタンを押してリストを開きます。
- 左端のサービスタブを選択します。
- IoT Core を選択します。
- ターゲットの選択の画面
- 選択ボタンを押してリストを開きます。
- 右端のコネクタタブを選択します。
- Raspberry Pi GPIO を選択します。
- 右下の次へボタンを押します。
トピックでデータをフィルタリングする画面を設定します。
- ここではこのサブスクリプション、メッセージングに使用するトピックを指定します。
- 今回はピンへの書き込み操作をしたいので、まずは一番下の必要なトピック構文のドロップダウンリストから、gpio/+/+/write を選択します。
- その後トピックのフィルターに、gpio/(Greengrass Core 名)/(操作したいピン番号) / write を入力します。今回私は、gpio/RaspberryPi/4/write と入力しています。
- 右下の次へボタンを押します。
クリックすると拡大します
サブスクリプションの確認と保存の画面をします。ここは確認画面ですので、上記の設定に間違いがなければ、右下の完了ボタンを押します。もし間違いがあれば戻るボタンを押して修正します。
サブスクリプションの画面では、再度正しくソースとターゲット、そしてトピックが設定されているか確認してください
これでサブスクリプションの設定も完了です。また AWS IoT Greengrass の必要な設定も完了しました。
5-4. デプロイ
しかしクラウド上で設定しただけで、デバイスにインストールされている Greengrass にはこの設定はまだ反映されていません。そこで最後にこれらの設定やコネクタを Raspberry Pi にデプロイして、デバイス上で動作させましょう。デプロイは簡単です。
- 今回の AWS IoT Greengrass グループの画面の右上にあるアクションボタンを押します。
- ドロップダウンリストからデプロイを選択します。
- デバイスによる Core の検出方法の設定の画面
- 初めて AWS IoT Greengrass グループのデプロイを実施する際には、この画面が表示されます。
- 右下の自動検出ボタンを押します。
これだけでデプロイが開始します。デプロイが開始されると、この AWS IoT Greengrass グループの画面でステータスが確認できます。保留中 → 進行中 → 正常に完了しました、とステータスが変わります。ここでエラーが出た際にはエラー内容を確認してデバッグしてください。AWS IoT Greengrass の設定で正しくない点や足りない箇所がある可能性があります。また、デプロイの際にはデバイス側で AWS IoT Greengrass が起動している必要があるので、そちらも確認してください。
これでデプロイは完了し、すべての準備が整いました。
クリックすると拡大します
6. 動作確認
先程までのステップで必要な作業は終了です。それではクラウドから機器を操作してみましょう。今回は AWS マネジメントコンソールからメッセージを Raspberry Pi に送信することで、機器を操作しようと思います。
- AWS IoT Core の画面を開く
- 必ず画面右上のリージョンを確認してください。先程指定したリージョンと同様に変更
- 左のサイドメニューからテストを選択
- MQTT クライアントの画面
- 下部にある発行の機能を用います。
- AWS IoT Greengrass のサブスクリプションで設定したトピックと同じトピック名をボックスに入力します。私の場合は gpio/RaspberryPi/4/write と入力しています。
- その下ではメッセージを設定できます。ここでは GPIO ピンを High にするか Low にするかメッセージに入力します。おそらく現在は Low なので、High にするために 1 とだけ入力します。
- トピックとメッセージが入力できたら、いよいよメッセージを送信します。トピック名ボックスの右にあるトピックに発行ボタンを押します。
- 同様にしてLowにしたい場合には、メッセージを 0 に変更してトピックに発行ボタンを押します。
クリックすると拡大します
機器は操作できたでしょうか。私は電球の点灯と消灯を行うことができました。
これで作業は全て終了です。
7. まとめ
このように Greengrass と GPIO コネクタを用いることで、簡単な設定のみでノンコーディングでクラウドから機器を操作できるようになりました。今回は GPIO の操作を行いましたが、この GPIO コネクタはピン状態の読み取りもできます。詳しくはこちらを参照してみてください。これにより、High/Low を扱う単純なセンサデータをノンコーディングでクラウドへ送信することもできます。
今回私は電球を操作しましたが、GPIO の High/Low で操作できるものであればどんなものでも接続し、クラウド経由で操作できます。
また今回は操作する UI を実装せず、AWS IoT のテスト画面を用いました。スマートホームデバイスとして実用するためには、操作するアプリや UI が必要です。ですが AWS IoT Core へメッセージ送信ができれば今回の構成で機器を操作できますので、アプリとの連携も是非考えてみてください。
このように、ノンコーディングでもアイディア次第で IoT デバイスを開発できることがわかりました。ぜひこの内容を参考に、さらにスマートな IoT デバイスを開発してみてください !
最後にちょっと宣伝です。最近 AWS IoT 開発者ポータルを公開しました。
IoT 関連の情報をまとめてウォッチしたい、という開発者の方に最適なページです。IoT 関連の最新コンテンツやハンズオン、直近のイベント情報、事例、関連リンクなどの情報をまとめて掲載しています。今後も都度更新されていきますので、是非定期的にご確認ください。
プロフィール
飯塚 将太
アマゾン ウェブ サービス ジャパン合同会社
IoT ソリューションアーキテクト
IoT Solutions Architect として、IoT のワークロードを持つお客様の技術支援しています。
自宅のスマートホーム化が趣味です。
AWS を無料でお試しいただけます