Webサービスでデバイスを操作する
第1回:Webでデバイスを操作してみよう
loTという言葉が一般的なものとなって久しい昨今、「loT」関連の記事もインターネット上に多く流れていると思います。そんな「loT」を独自の切り口で楽しく紹介してくれる連載がスタートします。記事を執筆頂くのはうすだひさしさん。これまでLinuxやRTOSの移植・ドライバ開発、Unix系OSのサーバ構築・管理、自動運転といった業務に携わってこられたエンジニアであるうすださんが、ラズパイとセンサを組み合わせたloTの制作を紹介してくれます。第1回ではWebでLEDを操作する方法を紹介頂きましたが、第2回ではWebサービスでデバイスを操作する方法を見ていきたいと思います。
目次
1. はじめに
「ラズパイとセンサで楽しむお手軽IoT」と称して、ラズパイにつないだデバイスを外部から操作したり、センサの情報を外部から読み取ったりする連載の第2回となります。
前回は、WebでLEDを操作する方法をご紹介しました。今回は、「IFTTT(IF This Then That)」というWebサービスを使って、ラズパイのGPIOにつないだLEDを操作したいと思います。
今回の構成としては、(Google Homeなどに搭載されている)Googleアシスタントに音声で指示を出すと、IFTTTのサービスを介して、ラズパイのWebサーバ(Apache HTTP Server)にアクセスします。その結果、LEDを点けたり消したりできるようになるところまで紹介していきたいと思います。
くどいようですが、GPIOを操作しているだけですので、つなぐデバイスを変えれば、音を鳴らしたり電化製品をON/OFFしたりすることも可能です。
2. 準備
今回必要となるものは下記となります。最初以外は前回と同じです。
第1回でご紹介した、ラズパイにLEDをつないで、WebサーバでLEDをON/OFFできる状態にしておいてください。
- Google HomeやNestなど、Googleアシスタントが搭載されているもの
- Raspberry Pi OSがインストールされたラズパイ本体
- LED
- 100Ωの抵抗
- ブレッドボードやジャンパワイヤ(適宜)
3. 外部からラズパイのWebサーバが見えるようにする
まず、IFTTTからラズパイのWebサーバにアクセスできるようにする必要があります。それには、自宅などで使われているブロードバンドルータの「ポートマッピング」という機能を使います。ポートマッピングは、外部のグローバルIPアドレスのポートと、内部のプライベートIPアドレスのポートを対応付けて、外部から後者へ直接アクセスできるようにする機能です。
市販されているブロードバンドルータの大半はポートマッピングの機能を持っています。メーカーや製品によって設定手順は異なりますが、ここでは例として、筆者が使用している「Aterm WG1200HP3」の設定手順を示します。
1. ブロードバンドルータにWebブラウザでアクセスして、詳細設定にある「ポートマッピング設定」をクリックします。
2. 今の設定が表示されます。「追加」ボタンをクリックします。
3. 「LAN側ホスト」にはラズパイのIPアドレス(ここでは「192.168.1.124」)、「プロトコル」にはTCP、ポート番号には80番を指定して、「設定」ボタンをクリックします。
4. (このルータの場合)設定を有効にするため再起動します。
設定できたら、お手持ちのスマホから「http://ラズパイのグローバルIPアドレス/wsgi/led.py?v=1」にアクセスします。
「ラズパイのグローバルIPアドレス」は、「グローバルIPアドレス 確認」などで検索すると、調べて表示してくれるサイトがいくつかあり、そのサイトで確認できます。なお、スマホのWi-Fiは使わない状態で確認してください(LAN以外からアクセスするためです)。
LEDが点灯したら、「http://ラズパイのグローバルIPアドレス/wsgi/led.py?v=0」にアクセスしてLEDを消します。
4. ドメイン名でアクセスできるようにする
外部からラズパイのWebサーバにアクセスできるようになりました。ですが、一般的なインターネット接続では、グローバルIPアドレスがときどき変わります。そのため、グローバルIPアドレスが変更されるたびに、外部からアクセスするときのURLを変える必要があります。
グローバルIPアドレスが変わらないようにするには、(大抵は有償の)サービスを利用する必要があります。ですが、「ダイナミックDNS」という仕組みを使えば、グローバルIPアドレスが変わっても同じドメイン名でアクセスできます。ダイナミックDNSのサービスは、プロバイダなどが提供していますが、ここでは「No-IP」を使って、常に同じドメイン名(URL)でアクセスできるようにします。
No-IPの設定手順を下記に示します。グローバルIPアドレスの変更に対応するため、「DUC(Dynamic Update Client」をラズパイにインストールして動かします。なお、No-IPは無償で利用できますが、登録できるドメイン数に制限があります。また、No-IPのサイトで定期的に更新処理を行う必要があります(有償に切り替えれば制限はなくなります)。面倒くさいな…と思われた貴兄で、今回の動作を少しの間だけ確認したいだけなら、No-IPの設定をおこなわず、いま設定されているグローバルIPアドレスでIFTTTの設定をしてしまっても構いません。
1. No-IPのサイトにアクセスし、アカウントを登録します。
このとき、使用したいドメイン名(ホスト名は自由、ドメイン名は「hopto.org」などから選択)も指定します。
2. ダウンロードのページから、DUCをダウンロードします。
3. ラズパイの任意の場所(たとえばホームディレクトリ)で、ダウンロードしたDUCのアーカイブを展開します。
(下記の「$」はシェルのプロンプトです。以下同様。)
$ tar xvzf noip-duc-linux.tar.gz $ cd noip-2.1.9-1/
4. 「build-essential」パッケージをインストールしていなければ、インストールします。
$ sudo apt install build-essential
5. 「make」コマンドを実行して、DUCをビルドします。
$ make
6. 「make install」コマンドを実行して、DUCをインストールします。(1.の登録時に入力したメールアドレスとパスワードを入力します)
$ sudo make install
7. サービスの設定ファイル「/etc/systemd/system/noip2.service」を作成します。ファイルの内容は下記の通りです。
[Unit] Description=No-IP Dynamic Update Client After=network.target remote-fs.target nss-lookup.target [Service] Type=forking ExecStart=/usr/local/bin/noip2 Restart=on-failure [Install] WantedBy=multi-user.target
8. サービスを登録して、起動します。
$ sudo systemctl daemon-reload $ sudo systemctl start noip2.service
9. 少し待ってから、「host」コマンドを実行して、ドメイン名からIPアドレスが解決できることを確認します。
$ host ドメイン名 ドメイン名 has address _IPアドレス_
10. 問題なければ、システム起動時に起動するようにしておきます。
$ sudo systemctl enable noip2.service
念のため、お手持ちのスマホで「http://ドメイン名/wsgi/led.py?v=1」にアクセスし、LEDの点灯を確認します。
5. IFTTTで操作できるようにする
最後に、IFTTTのサービスを使って、Googleアシスタントに話しかけるとLEDを操作できるようにします。IFTTTでは、Webサービス同士をつなぐことができます。あるWebサービスで指定した条件になったら(IF This)、別のWebサービスで指定したことをおこなわせる(Then That)ことができます。そして、指定した「This」と「That」の組合せをアプレットと言います。「ラズパイを点けて」と話しかけるとLEDを点灯するアプレットを作り、有効にする手順を下記に示します。
1. IFTTTにアクセスし、アカウントを作成します。
2. アプレットを作るため、「Create」ボタンをクリックします。
3. 「If This」ボタンをクリックして、トリガとなるWebサービスを選びます。たくさんのWebサービスの中から「Google Assistant」を選んでクリックします(アルファベット順なので前の方にあります) 。
4. Googleアシスタントのトリガを選びます。今回は固定の文言でいいので、「Say a simple phrase」を選びます。
5. 「Connect」ボタンをクリックします。下記のようにGoogleアカウントへのアクセスの許可を求められたら、許可します。
6. LEDを点けるときの文言を指定します。3つまで指定できますが、下記では2つ設定しています。応答の文言(ここでは「つけました」)も指定します。入力したら「Create trigger」ボタンをクリックします。
7. 次に、「Then That」ボタンをクリックして、アクションとなるWebサービスを選びます。「Webhooks」をクリックします(アルファベット順なので後ろの方です)。
8. 「Make a web request」をクリックします。
9. LEDを点けるためのURLを指定し、「Create action」ボタンをクリックします。
10. これで「This」と「That」を指定できました。「Continue」ボタンをクリックし、最後に「Finish」ボタンをクリックします。
あとは、Google Homeなどに「ラズパイを点けて」と話しかけるだけです。同様の手順で、「ラズパイを消して」と話しかけるとLEDを消灯するアプレットを作って有効にすれば、点けるだけでなく消すことも可能になります。
6. まとめ
今回は、IFTTTを使ってLEDを操作する方法をご紹介しました。ラズパイが外部からアクセスできる状態になりますので、セキュリティには十分注意してください(HTTPSを使う、ポート番号を(デフォルトの80番や443番以外に)変える、パス(URL)を複雑にする、アクセス制限するなどの対策をおこなってください。あるいは、ちょっと試したら、ポートマッピングの設定をもとに戻しましょう)。
さて、次回はセンサをつないで情報を取得・記録する方法をご紹介したいと思います。お楽しみに!
今回の連載の流れ
第1回:Webでデバイスを操作してみよう
第2回:Webサービスでデバイスを操作する(今回)
第3回:センサの値をRDBMSに記録する
第4回:RDBMSの情報をWebで可視化する