2020-06-21

Blynk RESTful APIを使って、Google Homeから操作したメモ IFTTT経由(Google Assistant=>webhook)

Blynkアプリを使わずに、Google Home(IFTTT経由)からRaspberry Piを操作したいな、と思ったときの作業メモです。


思うに、仕事のたびに
  •  Hueによる寝室ライトの点灯/消灯(寝室の端っこにデスクを構えている)
  •  Smartlifeによるスタンドライトの点灯/消灯(作業灯)
  •  Blynkによる、おもちゃの信号機を利用したステータス表示(ミーティング中の家族乱入防止)

をやるのはしんどい。
これをなんとかするには、手元に余っているGoogle Home Miniを使うのがよさそうだ。

こんなふうにしたい。

 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じゃないとか、色々メリットがあるらしい。
ということは、
  • blynk-library/linux/main.cppからつらなるなんらかのプログラムを書く
  • これによりVirtual Pinを定義&操作させる
  • コンパイルし、raspberry pi側で実行しておく
  • APIでVirtualPinを指定してリクエストし、動作させる
というのが必要そう。すでにsystemd配下でBlynkの実行はenabledとしているので、一旦とめて、プログラミングして、コンパイルして、実行して、動作確認して、再度systemdから有効にすればよさそう。
しかし、もう酒を飲んでるしC++書くのはつらいなぁ。コピペプログラミングをしよう。

http://blog.livedoor.jp/victory7com/archives/48432885.html#more
http://docs.blynk.cc/#blynk-firmware-blynktimer-blynk_writevpin
これを参考にコピペプログラミングさせていただこう!

pi@raspberrypi:~ $ cd ~/blynk/blynk-library
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 denied
<3 i="" p="">OK
<3 i="" p=""> これであとは`blynk/BLYNK_WRITE_V*.sh`をいじればいい

と思ったけどテキトーにいじってたら
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/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"
まぁvalue関係ないんだけどね。
うまくいったからOK。
<3 i="" p="">V0を叩けば赤、V1を叩けば黄色、V2を叩けば青、V3を叩くと全消灯となる。

あとは、IFTTTで、Google Assistant => webhookを作ればいい。
<3 i="" p="">ただ、ここで一瞬ハマったのが、なぜかIFTTT経由だと「blynk-cloud.com」が名前解決できないみたい。nslookupの結果のIPアドレスを突っ込んで設定する必要があった。
こんな感じでうごいた。

最後に、Google Assistantのルーティン設定もする。

完成です。

0 件のコメント: