Blynk RESTful APIを使って、Google Homeから操作したメモ IFTTT経由(Google Assistant=>webhook)
Blynkアプリを使わずに、Google Home(IFTTT経由)からRaspberry Piを操作したいな、と思ったときの作業メモです。
思うに、仕事のたびに
- Hueによる寝室ライトの点灯/消灯(寝室の端っこにデスクを構えている)
- Smartlifeによるスタンドライトの点灯/消灯(作業灯)
- Blynkによる、おもちゃの信号機を利用したステータス表示(ミーティング中の家族乱入防止)
をやるのはしんどい。
これをなんとかするには、手元に余っているGoogle Home Miniを使うのがよさそうだ。
こんなふうにしたい。
しかし、BlynkはGoogle Assistantと連携できない。
ということは、Blynk RESTful APIを利用して、IFTTT経由でGoogle Assistantと連携させる必要がある。
BlynkのAPIを調べる。
https://blynkapi.docs.apiary.io/#reference
AuthTokenはすでにアプリで発行している。
しかし、指定できるピンはVirtual Pinと書いてある。なんじゃそりゃ?
1時間ほど酒を飲みながらネットサーフィンしていた結果、VirtualPinっていうのは、ピンではないことがわかった。物理ピンを束ねてあげて、仮想的にプログラムからピンとして扱うらしい。これだとGPIOと違って0/1じゃないとか、色々メリットがあるらしい。
こんなふうにしたい。
Google Home Miniのルーティン | やること |
リモートワークを開始して | Hue寝室ライトOn Smartlifeスタンドライト点灯 Blynk青信号点灯 |
リモートワークを終了して | Smartlifeスタンドライト消灯 Blynk全信号消灯 |
赤信号をつけて | Blynk赤信号点灯、それ以外消灯 |
黄色の信号をつけて | Blynk黄信号消灯、それ以外消灯 |
青信号をつけて | Blynk青信号消灯、それ以外消灯 |
信号を消して | Blynk消灯 |
しかし、BlynkはGoogle Assistantと連携できない。
ということは、Blynk RESTful APIを利用して、IFTTT経由でGoogle Assistantと連携させる必要がある。
BlynkのAPIを調べる。
https://blynkapi.docs.apiary.io/#reference
AuthTokenはすでにアプリで発行している。
しかし、指定できるピンはVirtual Pinと書いてある。なんじゃそりゃ?
1時間ほど酒を飲みながらネットサーフィンしていた結果、VirtualPinっていうのは、ピンではないことがわかった。物理ピンを束ねてあげて、仮想的にプログラムからピンとして扱うらしい。これだとGPIOと違って0/1じゃないとか、色々メリットがあるらしい。
ということは、
しかし、もう酒を飲んでるしC++書くのはつらいなぁ。コピペプログラミングをしよう。
http://blog.livedoor.jp/victory7com/archives/48432885.html#more
- blynk-library/linux/main.cppからつらなるなんらかのプログラムを書く
- これによりVirtual Pinを定義&操作させる
- コンパイルし、raspberry pi側で実行しておく
- APIでVirtualPinを指定してリクエストし、動作させる
しかし、もう酒を飲んでるしC++書くのはつらいなぁ。コピペプログラミングをしよう。
http://blog.livedoor.jp/victory7com/archives/48432885.html#more
pi@raspberrypi:~ $ cd ~/blynk/blynk-library<3 i="" p="">OK3>
pi@raspberrypi:~ $ cp linux/main.cpp{,.backup}
pi@raspberrypi:~ $ cd ~/blynk/blynk-library/linux
pi@raspberrypi:~ $ vim main.cpp
pi@raspberrypi:~/blynk/blynk-library/linux $ diff main.cpp{.backup,}
30,32c30,40
< BLYNK_WRITE(V1)
< {
< printf("Got a value: %s\n", param[0].asStr());
---
> void blynk_write_exec(int pin, const BlynkParam& param) {
> char command[256] = "";
> char buff[256] = "";
> sprintf(command, "/home/pi/blynk/BLYNK_WRITE_V%d.sh", pin);
> for (int i=0; i<3 i="" p="">> if(! param[i].isValid()) break;
> sprintf(buff, " %d", param[i].asInt());
> strcat(command, buff);
> }
> BLYNK_LOG("Command: %s", command);
> system(command);
34a43,47
> BLYNK_WRITE(V0) { blynk_write_exec(V0, param); }
> BLYNK_WRITE(V1) { blynk_write_exec(V1, param); }
> BLYNK_WRITE(V2) { blynk_write_exec(V2, param); }
> BLYNK_WRITE(V3) { blynk_write_exec(V3, param); }
>
61d73
<
pi@raspberrypi:~ $ make clean all target=raspberry
rm main.o ../src/utility/BlynkDebug.o ../src/utility/BlynkHandlers.o ../src/utility/BlynkTimer.o blynk
rm: 'main.o' を削除できません: そのようなファイルやディレクトリはありません
rm: '../src/utility/BlynkDebug.o' を削除できません: そのようなファイルやディレクトリはありません
rm: '../src/utility/BlynkHandlers.o' を削除できません: そのようなファイルやディレクトリはありません
rm: '../src/utility/BlynkTimer.o' を削除できません: そのようなファイルやディレクトリはありません
rm: 'blynk' を削除できません: そのようなファイルやディレクトリはありません
make: [Makefile:64: clean] エラー 1 (無視されました)
g++ -I ../src/ -I ./ -DLINUX -c -O3 -w -DRASPBERRY main.cpp -o main.o
g++ -I ../src/ -I ./ -DLINUX -c -O3 -w -DRASPBERRY ../src/utility/BlynkDebug.cpp -o ../src/utility/BlynkDebug.o
g++ -I ../src/ -I ./ -DLINUX -c -O3 -w -DRASPBERRY ../src/utility/BlynkHandlers.cpp -o ../src/utility/BlynkHandlers.o
g++ -I ../src/ -I ./ -DLINUX -c -O3 -w -DRASPBERRY ../src/utility/BlynkTimer.cpp -o ../src/utility/BlynkTimer.o
g++ main.o ../src/utility/BlynkDebug.o ../src/utility/BlynkHandlers.o ../src/utility/BlynkTimer.o -lrt -lpthread -s -lwiringPi -o blynk
pi@raspberrypi:~ $ touch blynk/BLYNK_WRITE_V1.sh
pi@raspberrypi:~ $ touch blynk/BLYNK_WRITE_V2.sh
pi@raspberrypi:~ $ touch blynk/BLYNK_WRITE_V3.sh
pi@raspberrypi:~ $ sudo service blynk start
pi@raspberrypi:~ $ sudo service blynk status
● blynk.service
Loaded: loaded (/etc/systemd/system/blynk.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2020-06-21 00:53:21 JST; 1min 18s ago
Main PID: 12324 (blynk)
Memory: 976.0K
CGroup: /system.slice/blynk.service
└─12324 /home/pi/blynk/blynk-library/linux/blynk --token=<AuthToken伏せ>
6月 21 00:53:21 raspberrypi blynk[12324]: [2]
6月 21 00:53:21 raspberrypi blynk[12324]: ___ __ __
6月 21 00:53:21 raspberrypi blynk[12324]: / _ )/ /_ _____ / /__
6月 21 00:53:21 raspberrypi blynk[12324]: / _ / / // / _ \/ '_/
6月 21 00:53:21 raspberrypi blynk[12324]: /____/_/\_, /_//_/_/\_\
6月 21 00:53:21 raspberrypi blynk[12324]: /___/ v0.6.1 on Linux
6月 21 00:53:21 raspberrypi blynk[12324]: [2] Connecting to blynk-cloud.com:80
6月 21 00:53:22 raspberrypi blynk[12324]: [294] Ready (ping: 122ms).
6月 21 00:53:34 raspberrypi blynk[12324]: sh: 1: /home/pi/blynk/BLYNK_WRITE_V1.sh: Permission denied
6月 21 00:53:34 raspberrypi blynk[12324]: sh: 1: /home/pi/blynk/BLYNK_WRITE_V1.sh: Permission denied3>
<3 i="" p="">
これであとは`blynk/BLYNK_WRITE_V*.sh`をいじればいい
と思ったけどテキトーにいじってたら
って感じだったので、パーミッション設定が必要そう。
chmod 700したろー。
よっぱらってるしシェルはてけとーでいいよねーーーーーん(面倒)
ぼあかぁ思うよ、動けばいいんだって。
こまけーことかかねー
結果だけ見せるぜ。
おらよ。結局param使ってなくて笑うwww
まぁいいんだよ、動けばな
Blynkアプリ側でテキトーにVirtualPin0〜4のボタン作って動作確認OK。
次にAPIで動作するかどうか
うまくいったからOK。3>
と思ったけどテキトーにいじってたら
pi@raspberrypi:~ $ sudo service blynk status
略
6月 21 00:53:34 raspberrypi blynk[12324]: sh: 1: /home/pi/blynk/BLYNK_WRITE_V1.sh: Permission denied
って感じだったので、パーミッション設定が必要そう。
chmod 700したろー。
よっぱらってるしシェルはてけとーでいいよねーーーーーん(面倒)
ぼあかぁ思うよ、動けばいいんだって。
pi@raspberrypi:~/blynk $ cd; ll blynk/
合計 48
drwxr-xr-x 3 pi pi 4096 6月 21 01:23 .
drwxr-xr-x 20 pi pi 4096 6月 21 01:22 ..
-rwx------ 1 pi pi 81 6月 21 01:11 BLYNK_WRITE_V1.sh
-rwx------ 1 pi pi 81 6月 21 01:11 BLYNK_WRITE_V2.sh
-rwx------ 1 pi pi 81 6月 21 01:12 BLYNK_WRITE_V3.sh
-rwx------ 1 pi pi 0 6月 21 01:23 BLYNK_WRITE_V4.sh
-rwx------ 1 pi pi 141 6月 21 01:17 blue_off.sh
-rwx------ 1 pi pi 141 6月 21 01:17 blue_on.sh
drwxr-xr-x 10 pi pi 4096 6月 10 23:27 blynk-library
-rwx------ 1 pi pi 141 6月 21 01:17 red_off.sh
-rwx------ 1 pi pi 141 6月 21 01:17 red_on.sh
-rwx------ 1 pi pi 141 6月 21 01:17 yellow_off.sh
-rwx------ 1 pi pi 141 6月 21 01:17 yellow_on.sh
こまけーことかかねー
結果だけ見せるぜ。
pi@raspberrypi:~/blynk $ for fn in `ls ./*.sh`;do echo "=====";echo $fn;cat $fn;done
=====
./BLYNK_WRITE_V0.sh
/home/pi/blynk/red_on.sh
/home/pi/blynk/yellow_off.sh
/home/pi/blynk/blue_off.sh
=====
./BLYNK_WRITE_V1.sh
/home/pi/blynk/red_off.sh
/home/pi/blynk/yellow_on.sh
/home/pi/blynk/blue_off.sh
=====
./BLYNK_WRITE_V2.sh
/home/pi/blynk/red_off.sh
/home/pi/blynk/yellow_off.sh
/home/pi/blynk/blue_on.sh
=====
./BLYNK_WRITE_V3.sh
/home/pi/blynk/red_off.sh
/home/pi/blynk/yellow_off.sh
/home/pi/blynk/blue_off.sh
=====
./BLYNK_WRITE_V4.sh
/home/pi/blynk/red_off.sh
/home/pi/blynk/yellow_off.sh
/home/pi/blynk/blue_off.sh
=====
./blue_off.sh
#!/bin/sh
# 青信号消灯
echo 4 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio4/direction
echo 0 > /sys/class/gpio/gpio4/value
=====
./blue_on.sh
#!/bin/sh
# 青信号点灯
echo 4 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio4/direction
echo 1 > /sys/class/gpio/gpio4/value
=====
./red_off.sh
#!/bin/sh
# 赤信号消灯
echo 2 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio2/direction
echo 0 > /sys/class/gpio/gpio2/value
=====
./red_on.sh
#!/bin/sh
# 赤信号点灯
echo 2 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio2/direction
echo 1 > /sys/class/gpio/gpio2/value
=====
./yellow_off.sh
#!/bin/sh
# 黄信号消灯
echo 3 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio3/direction
echo 0 > /sys/class/gpio/gpio3/value
=====
./yellow_on.sh
#!/bin/sh
# 黄信号点灯
echo 3 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio3/direction
echo 1 > /sys/class/gpio/gpio3/value
おらよ。結局param使ってなくて笑うwww
まぁいいんだよ、動けばな
Blynkアプリ側でテキトーにVirtualPin0〜4のボタン作って動作確認OK。
次にAPIで動作するかどうか
curl -v "http://blynk-cloud.com/まぁvalue関係ないんだけどね。update/V0?value=1"
curl -v "http://blynk-cloud.com/update/V1?value=1"
curl -v "http://blynk-cloud.com/update/V2?value=1"
curl -v "http://blynk-cloud.com/update/V3?value=1"
うまくいったからOK。3>
<3 i="" p="">V0を叩けば赤、V1を叩けば黄色、V2を叩けば青、V3を叩くと全消灯となる。
あとは、IFTTTで、Google Assistant => webhookを作ればいい。3>
あとは、IFTTTで、Google Assistant => webhookを作ればいい。3>
<3 i="" p="">ただ、ここで一瞬ハマったのが、なぜかIFTTT経由だと「3>blynk-cloud.com」が名前解決できないみたい。nslookupの結果のIPアドレスを突っ込んで設定する必要があった。
こんな感じでうごいた。
最後に、Google Assistantのルーティン設定もする。
完成です。
コメント