Google Homeに話しかけて物理スイッチを音声操作してみる

# はじめに
この記事は スマートスピーカー Advent Calendar 2017 17日目の記事です。
が、最終日まで投稿が無いようでしたので代わりに投稿させて頂きます。

ESP32とサーボモーターでお手軽Wi-Fi物理スイッチを作ってお風呂のお湯はりをGoogle Homeから音声操作してみようと思います。

今回グローバル→ローカルのネットワーク接続をBlynkを使って行っていますが、Firebase経由にすれば[前回記事で作ったWebアプリ](https://qiita.com/miso_develop/items/09fcce17162db49dec55)で外出先から操作して家に着く前にお風呂を沸かしておくといった事もできますね。

そして気になるコストですが、1,000円弱で済ませられます。
「[MicroBot Push](https://www.amazon.co.jp/Naran-%E3%83%9E%E3%82%A4%E3%82%AF%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E3%83%97%E3%83%83%E3%82%B7%E3%83%A5-2nd-Generation-%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E6%8A%BC%E3%81%97%E3%81%A6%E3%81%8F%E3%82%8C%E3%82%8B%E8%B6%85%E5%B0%8F%E5%9E%8B%E6%8C%87%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88/dp/B06Y2V62KV/ref=sr_1_3)」や「[Switch Bot](https://www.amazon.co.jp/Reshare-Switch-Bot-Bot%EF%BD%9C%E3%83%AF%E3%82%A4%E3%83%A4%E3%83%AC%E3%82%B9%E3%81%A7%E3%81%94%E5%AE%B6%E5%BA%AD%E3%81%AB%E6%A9%9F%E5%99%A8%E3%81%AE%E3%82%AA%E3%83%B3%E3%82%AA%E3%83%95%E6%93%8D%E4%BD%9C%E5%8F%AF%E8%83%BD%E3%81%AA%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E3%80%8C%E3%82%B9%E3%82%A4%E3%83%83%E3%83%81%E3%83%9C%E3%83%83%E3%83%88%E3%80%8D/dp/B06X92KHPV/ref=sr_1_1)」といった製品だと5,000円ほどしますので格安ですね。



# 実際の動作

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">Qiita記事用動画です。<br>お手軽Wi-Fi物理スイッチをGoogle Homeで音声操作。 <a href="https://t.co/ezfgwuftas">pic.twitter.com/ezfgwuftas</a></p>&mdash; 田中みそ (@miso_develop) <a href="https://twitter.com/miso_develop/status/945073993169514497?ref_src=twsrc%5Etfw">2017年12月24日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

設置方法には改善の余地が多々ありますので、工夫してみて下さい…



# 処理の流れ
![image](https://qiita-image-store.s3.amazonaws.com/0/207109/2f810293-0104-d9a3-2102-b6f9fe0cf2cc.png)



# いるもの

|いるもの|価格(&yen;)|備考|
|---|--:|---|
|[ESP32開発ボード](https://ja.aliexpress.com/item/ESP-32-ESP-32S-Development-Board-WiFi-Bluetooth-Ultra-Low-Power-Consumption-Dual-Cores-ESP32-Board/32800930387.html)|749|　|
|[サーボモーター](https://ja.aliexpress.com/item/250-450-sg90-9-rc-1/32839396457.html)|117|　|
|[電池ケース](https://ja.aliexpress.com/item/Box-Holder-For-3-x-AA-Black-With-Wire-Leads-Plastic-Battery-Storage-Case/32814958666.html)|35|単3×3本|
|[基盤](http://akizukidenshi.com/catalog/g/gP-12731/)|15|　|
|ケース|34|100均で3箱100円とかで適当に|
|**合計**|**950**|　|

まだ手元に届いてなく試せていないのですが、ESP32を[これ](https://www.amazon.co.jp/KKHMF-ESP8266%E3%81%AB%E5%9F%BA%E3%81%A5%E3%81%84%E3%81%A6-NodeMCU-WIFI%E7%84%A1%E7%B7%9A%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB-%E9%96%8B%E7%99%BA%E3%83%9C%E3%83%BC%E3%83%89/dp/B018ECQX6U/ref=sr_1_1)に置き換えたらも少し安く済みそうです。

はんだ付けめんどいって方は[ブレッドボード](https://ja.aliexpress.com/item/Free-Shipping-wholesale-1pcs-lot-SYB-170-Mini-Solderless-Prototype-Experiment-Test-Breadboard-170-Tie-points/32758649025.html)をご使用下さい。



# 回路
こんな感じに組みます。
![201712241834243411_min.JPG](https://qiita-image-store.s3.amazonaws.com/0/207109/e647f0e8-0edf-35d7-57ce-58a60244de92.jpeg)

サーボモーターからは3色のケーブルが出ています。
それぞれのケーブルを以下のようにESP32へ繋ぎます。

|サーボモーター|ESP32|備考|
|---|---|---|
|茶色|GND|GND|
|赤|5V|電源|
|オレンジ|IO13|信号|

あとはGNDと電源に電池繋げて完成です。



# ESP32ソース
ESP32はArduino IDEを使って開発を行います。
まずは環境構築ですが、[こちら](https://qiita.com/miso_develop/items/9c81753a69cb80e006a9#%E9%96%8B%E7%99%BA%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89)を参照下さい。

またグローバル→ローカルの通信にBlinkを使用しています。
Blinkのプロジェクト作成も事前に必要になりますので、[こちら](https://qiita.com/miso_develop/items/9c81753a69cb80e006a9#%E3%82%B5%E3%83%BC%E3%83%90esp32%E9%80%9A%E4%BF%A1)を参考に準備してみて下さい。

上記の準備ができたら以下のソースをESP32へ書き込みましょう。
`auth[]`、`ssid[]`、`pass[]`はご自身の環境のものに書き換えて下さい。
また`BLYNK_WRITE(V1)`の中央の`ledcWrite`でサーボモーターの押し込み具合を調節してみて下さい。

パスワードは以下の記事を参考に暗号化して書くことをオススメします。
[ESP32のArduinoスケッチにWi-Fiのパスワードを平文で書くのはやめよう！](https://qiita.com/mascii/items/bbee7b7bff9cf5a2f833)

```c
#define BLYNK_PRINT Serial
 
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include "esp_system.h"
 
char auth[] = "xxxxxxxx"; //Blynkから送られてきたメール内にあるAuth Token
char ssid[] = "xxxxxxxx"; //ルーターのSSID
char pass[] = "xxxxxxxx"; //ルーターのパスワード

void setup() {
  ledcSetup(0, 50, 10);
  ledcAttachPin(13, 0);
 
  Blynk.begin(auth, ssid, pass);
}

void loop() {
  Blynk.run();
}

BLYNK_WRITE(V1) {
  ledcWrite(0, 80);
  delay(500);
  ledcWrite(0, 70); //サーボモーターの押し込み具合はここで調節
  delay(500);
  ledcWrite(0, 80);
}
```

ここまできたら以下のURLへアクセスすることで動作を確認できます。
`xxxxxxxx`部はAuth Tokenに書き換えて下さい。
`http://188.166.206.43/xxxxxxxx/update/V1?value=0`



# IFTTT Appletの作成
あとはIFTTTでApplet作れば完成です。

## 「this」のレシピ
「Google Assistant」の「Say a simple phrase」で以下のように設定します。
![image](https://qiita-image-store.s3.amazonaws.com/0/207109/2687f50e-b19c-0890-8d4e-5f474536e52e.png)

## 「that」のレシピ
「Webhook」の「Make a web request」で以下のように設定します。
![image](https://qiita-image-store.s3.amazonaws.com/0/207109/88514816-6533-7089-6e14-9b5c062b4351.png)



# おわりに
現在のうちの給湯器だと動画のボタンを押したあとにお風呂の蛇口を捻らなければならないので、実際は自動化できていません…
しかしもうすぐ引っ越しを控えているので、引っ越し後はまともな給湯器になっているので効果を発揮できそうです。
それまでにFirebase経由で外出先からも操作できるようにしてみたいと思います。