rcmdnk's blog
Last update

Blynk - IoT for Arduino, ESP32

この前 Raspberry PiからSwitch Botを動かせるようになりましたが、 今度はネットワーク経由で動かせるようにします。

これで外出先からでも動かせるようになるはずです。

Sponsored Links

Raspberry Piの設定

今使ってるのはRaspberry Pi Zero WHです。

この前のところまででSwitch BotをRaspberry Piから動かせるようにはなりました。

今回はネットワーク経由でRaspberry Piに信号を送って、ネットワーク経由で Switch Botを動かせるようにしてみます。

Blynk

Blynk - IoT for Arduino, ESP32
デベロッパ: Blynk Inc
無料

BlynkはRaspberry Piなどのmicrocomputerを簡単にスマホから操作出来る様にしてくれるアプリ/サービスです。 iPHone、Androidともにアプリがあります。

Raspberry PiなどでBlynkサービスを実行しておき、 スマホからBlynkサーバー経由でそこへアクセスして操作したり情報を取ってきたり出来ます。

基本的に無料で、より多くのボタンなどを使いたい場合などには課金する様な料金体制になっています。

非常に多機能でまだ使いこなせてませんが、とりあえず簡単な使い方だけ。

初期セットアップ

まずはメールアドレスなどを登録する必要があります。 インストールしたアプリに従って。

新しいプロジェクトを作る

設定が済むとProjectを作れるようになります。

20190818_blynkcreateproject.png

こんな画面からNew Projectを選ぶと、名前(Project Name)とデバイスの種類(CHOSE DEVICE)、 接続の方法(CONNECTION TYPE)を選ぶ様になります。

20190818_blynknewprojectinit.png

名前は適当にリモコンとか入れて、デバイスの種類を選びますが、ここにRaspberry Pi Zeroはありません。

20190818_blynkdevice.png

ただ、ピン配列などは2014年発売のRaspberry Pi 1 Model B+以前のものと、それ以降で違うだけなので、 現行モデルの他のものを選んでおけばとりあえずは大丈夫です。

GPIO - Raspberry Pi Documentation

Raspberry Pi - Wikipedia

機能によってはZeroだと使えないものもあるかもしれませんが、 簡単なコマンドを送ったり、GPIOピンの電圧レベルを変えたりすることは出来ます。

ということで、Raspberry Pi 3 Bを選びます。

CONNECTION TYPEはWiFiを選べばBlynkサーバー経由でネットワークから操作できますし、 その他BluetoothやUSB/Ethernetなど物理的につなげることも可能です。

20190818_blynkconnection.png

今回はネットワークでやりたいのでWiFiを選択。

プロジェクトを作るとAuth Tokenが作られ、登録したメールで送られてきます。

プロジェクトの初期画面はこんな感じ。

20190818_blynkprojectinit.png

また、このTokenはプロジェクトの設定画面からも確認できます。 右上の三角の左側のナットみたいな設定ボタンを押して、

20190818_blynkprojectsettings.png

このProject SeeingsのところのAUTH TOKENという項目にあります。

Raspberry Pi側でBlynkサーバーを立ち上げる

BlynkがBlynk用のライブラリを公開しています。

どうやらblynkというユーザー名はすでに居て取れなかったためにblinkkkにした模様。(blynkkは居ないけどわかりやすく区別するために3つのk?)

Linux用のREADMEy を参考に、Raspberry Piで、

[email protected]:~ $ sudo apt install wiringpi
[email protected]:~ $ git clone https://github.com/blynkkk/blynk-library.git
[email protected]:~ $ cd blynk-library/linux
[email protected]:~/blynk-library/linux $ make clean all target=raspberry

これで~/blink-libary/linuxblinkという実行ファイルが出来ているはずです。

ここで先程作ったプロジェクトのTokenが必要になります。 Tokenを確認して、

[email protected]:~/blynk-library/linux $ sudo ./blynk --token=<YourToken>

[0]
    ___  __          __
   / _ )/ /_ _____  / /__
  / _  / / // / _ \/  '_/
/____/_/\_, /_//_/_/\_\
        /___/ v0.6.1 on Linux


[5] Connecting to blynk-cloud.com:80
[187] Ready (ping: 81ms).

<YourToken>のところは作ったプロジェクトのTokenにしてください。 正しいTokenであれば上の様にBlynkのロゴが出てきてblynk-cloud.comに接続し、 Readyな状態になります。

これでRaspberry Pi側の初期設定はOK。

とりあえずターミナルはそのままblynkを実行したままにしておきます。

スマホから接続チェック

さて、ここで一回スマホに戻って先程作ったプロジェクトのページに行きます。

Raspberry PiでBlynkサーバーが立ち上がっていれば接続出来るはずです。

プロジェクトの右上の ▷マークを押せば接続できるはずです。

▷マークが□になったら実行モードで、 この状態でその隣のマークを押すと接続情報が確認出来ます。 (ちょっとすでにボタンを設置したあとの画像になってしまっていますが。)

20190818_blynkconnected.png

20190818_blynkcheck.png

アプリでボタンの設置

□を押して最初の編集モードに入ります。 そうするとなにもないページになってると思います。 右上のマークが□でなく▷になってることを確認してください。

▷状態だと編集モード、 □状態だと実行モードになります。

それぞれボタンを押すとそっち(▷:実行、□:停止)になるよ、という意味かと。

編集モードだと画面がが基盤の様な点々になってるかと思いますが、 この適当なところをタップします。

そうするとWidget Boxが出てくるので、その中からButtonをタップして設置します。

設置したボタンをタップすると、Button Settings画面になります。

20190818_blynkv1setting.png

ここで

  • 一番上のButtonを適当な名前に
  • PINVirtualV1
  • その横の数字は01のまま
  • MODEPUSHのまま
  • ON/OFF LABELSはそのままでも良いですがここでの例では解錠ボタンに使ってるので解錠にしてあります。
    • 1の状態だとONのものが表示されますが、今回はPUSHですぐに戻るので表示をごちゃごちゃしないために同じ文字列にしています。それでも押すと1になってる間はボタンの色が変わります。

とします。

PINDIGITALとなっている方のGP2GP3…などはRaspberry PiのGPIOのピン番号になり、 出力電圧の盛業が出来るようになります。

20190818_blynkbuttonpin.png

VirtualV0V1…は仮想的なボタンで物理的には何もしませんが、 状態を受け取ってRaspberry Pi側でプログラムを動かしたりするのに使えます。

MODEではPUSHであれば一度1にあげて0に落とす、信号がそれぞれ送られます。 (数字は上のPINの横で設定したもの。)

SWITCHにすれば片方ずつ信号が送られる様になるわけです。

20190818_blynkv1.png

20190818_blynkconnected.png

準備ができたらプロジェクトページに戻り右上の▷ボタンを押して実行モードにします。

そして作ったボタンをタップしてみます。

タップする時に先程blynkを走らせていたターミナルを確認します。

上手く行けば下の様にGot a value: 1Got a value: 0 という2つの行がスマホ上のボタンをタップするたびに出てきます。

[email protected]:~/blynk-library/linux $ sudo ./blynk --token=<YourToken>
[0]
    ___  __          __
   / _ )/ /_ _____  / /__
  / _  / / // / _ \/  '_/
/____/_/\_, /_//_/_/\_\
        /___/ v0.6.1 on Linux


[5] Connecting to blynk-cloud.com:80
[187] Ready (ping: 81ms).
Got a value: 1
Got a value: 0
Got a value: 1
Got a value: 0
Got a value: 1
Got a value: 0
Got a value: 1
Got a value: 0
Got a value: 1
Got a value: 0

スマホからRaspberry Piに信号を送ることが出来ました。

ボタンの削除

作ったボタンの削除は編集モードでボタンを長押しするとドラッグできるようになり上に 2つのマークが出てくるので右側のリサイクルぽいマークの方に持っていくと削除できます。

左の方は複製を作る機能になっています。

20190818_blynkdelete.png

課金について

ここでButtonを一つ設置しましたが、 Widget Boxの上のところのYOUR ENERGY BALANCEの数字が2000から1800になってるかと思います。

Buttonの下に200とあるので1つボタンを設置するのに200のENERGY BALANCEが必要、ということで、 つまり1つのアプリで使えるボタンは10個まで、ということになります。

他のWidgetも色々違うENERGYで900のSuperChartとかもあります。

このYOUR ENERGY BARANCEは全てのプロジェクトで共有されています。

増やしたい場合はYOUR ENERGY BARANCEの右にあるAddボタンから課金して増やすことになります。

1000ENERGYで240円、5000で600円、など。

ボタンの動作を設定する

今の所ただ来た信号を表示しているだけですが、 実際に何かやりたいときは blynk-library/linuxディレクトリにあるmain.cppの中身を編集して再コンパイルします。

一度blynkCtrl-Cなどで止めます。

main.cppviとかで開いてみると

main.cpp
1
2
3
4
BLYNK_WRITE(V1)
{
    printf("Got a value: %s\n", param[0].asStr());
}

こんなコードがあると思います。

BLYNK_WRITE(PIN)という関数が引数の番号のバーチャルピンへの信号が来た時に実行される関数になります。 (関数名やPIN番号はマクロで実際のものに定義されているのでこんな感じの型名のない形になってます。)

同様にBLYNK_READ(PIN)という関数もあって、こちらはスマホからこの番号への要求が来ると なんらかの返り値を返しスマホに返すようになります。 ボタンの設定では使いませんが、Virtual Displayなど返って来た値を表示するWidgetもあるのでそういった所でつかいます。

とりあえず今は BLYNK_WRITE(V1) というV1ピンに信号が送られてきた時に実行される関数について。

デフォルトでGot a value: ….というprintfするだけの関数になっているのがわかります。

また、これ以外にBLYNK_WRITEなどの関数が無いのもわかると思います。

なのでV1以外のVirtualピンを指定してボタンをタップしても今の時点では何も起こりませんし出力もされません。 BLYNK_WRITE(V2) とかを作ればV2に送られてきた信号に対してなにか出来るようになります。

V1への信号に対してSwitch Botを操作する様なコマンドを実行する様にしてみます。

main.cpp
1
2
3
4
5
6
7
BLYNK_WRITE(V1)
{
    printf("Got a value for V%d: %s\n", V1, param[0].asStr());
    if(param[0].asInt() == 1){
      system("sudo python3 /home/pi/python-host/switchbot_py3.py --device <BLE MAC ADDRESS>");
    }
}

確認のためprintfは残したまま、 変更を確認するためちょっと余計にピン番号を書くように足しています。 (V1, V2はInt型の1, 2, …にマクロで定義されています1。)

Raspberry PiからSwitch Botを操作する で出来るようになったコマンドをsystem関数で実行するようにしています。

PUSHだとボタンをタップするたびに1と0がそれぞれ送られてくるので 1のときだけ実行するようにもしています。

paramという変数は BlynkParam というクラスのオブジェクトの配列で このオブジェクトはスマホから送られてきた信号が入っていますが、 toStr()とかtoInt()など適当な型に変更して返してくれるメンバ関数を持っています。

今回のボタンからは0か1が送られてくるので比較のときはInt型で比較。

ここまで出来たら再コンパイルします。

[email protected]:~/blynk-library/linux $ make clean all target=raspberry

うまくいったらまたblynkを実行します。

[email protected]:~/blynk-library/linux $ sudo ./blynk --token=<YourToken>
[0]
    ___  __          __
   / _ )/ /_ _____  / /__
  / _  / / // / _ \/  '_/
/____/_/\_, /_//_/_/\_\
        /___/ v0.6.1 on Linux


[6] Connecting to blynk-cloud.com:80
[241] Ready (ping: 81ms).
Got a value for V1: 1
Got a value for V1: 0
Got a value for V1: 1
Got a value for V1: 0

と、ターミナル上では変更が有効になっていることが確認出来るかと思います。

同時にSwitch Botも動くのが確認できればOKです。

上手く行かない場合は直接systemに渡したコマンドを実行してみたりして確かめてみてください。

Ref:

Blynk docs

Raspberry Piブログ : 第3回 CPUの温度/周波数/負荷状態を見よう - 連載 IoTサービス「Blynk」を使ってRaspberry Piをスマホからコントロールしよう

デーモンプログラムにする

これでスマホからネットワーク経由でSwitch Botが操作できるようになりました。 Switch Bot Hub Plusは必要ありません。

ただ、今のままだと毎回Raspberry Piを立ち上げて、接続してblynkコマンドを実行しておかないといけません。 これを回避するためにデーモンとして自動で立ち上がるようにします。

これを参考に /etc/systemd/system/blynk.serviceというファイルを以下の様な内容で作ります2

/etc/systemd/system/blynk.service
1
2
3
4
5
6
7
8
9
10
[Unit]
Description = Blynk service

[Service]
ExecStart = /home/pi/blynk-library/linux/blynk --token=<YourToken>
ExecStop = /bin/kill $MAINPID
Restart = always

[Install]
WantedBy = multi-user.target

ここでも<YourToken>は自分のBlynkプロジェクトのものに変更してください。

もっとちゃんとやりたければ、 /etc/blynk.confとかを読み込んでTokenを取得してそれを使ってblynkを実行する様な ラッパースクリプトを作っても良いかもしれません。

とりあえず今回はそのまま(blynkもpiユーザーのHomeに置いたままであれですが。。。)。

ファイルを書けたらデーモンとして実行してみます。

[email protected]:/etc/systemd/system $ sudo systemctl start blynk
[email protected]:/etc/systemd/system $ journalctl -f -u blynk
-- Logs begin at Sat 2019-08-17 06:17:02 JST, end at Sat 2019-08-17 10:58:50 JST
Aug 17 10:58:50 raspberrypi systemd[1]: Started Blynk service.
Aug 17 10:58:50 raspberrypi blynk[1389]: [0]
Aug 17 10:58:50 raspberrypi blynk[1389]:     ___  __          __
Aug 17 10:58:50 raspberrypi blynk[1389]:    / _ )/ /_ _____  / /__
Aug 17 10:58:50 raspberrypi blynk[1389]:   / _  / / // / _ \/  '_/
Aug 17 10:58:50 raspberrypi blynk[1389]:  /____/_/\_, /_//_/_/\_\
Aug 17 10:58:50 raspberrypi blynk[1389]:         /___/ v0.6.1 on Linux
Aug 17 10:58:50 raspberrypi blynk[1389]: [8] Connecting to blynk-cloud.com:80
Aug 17 10:58:50 raspberrypi blynk[1389]: [355] Ready (ping: 81ms).

どうやら動いているようです。

この状態でスマホのボタンを押してGot a value…という表示がjournalctlで確認でき Switch Botが動くのを確認してください。

次に起動時に実行される様に設定します。

[email protected]:~ $ systemctl is-enabled blynk
disabled
[email protected]:~ $ sudo systemctl enable blynk
Created symlink /etc/systemd/system/multi-user.target.wants/blynk.service → /etc/systemd/system/blynk.service.
[email protected]:~ $ systemctl is-enabled blynk
enabled

enabledになっていれば今後Raspberry Piが起動した時にblynkがデーモンとして実行されるようになります。

ここで一度試しに再起動してみます。

[email protected]:~ $ sudo reboot

しばらく待って再起動したくらいでスマホのボタンをタップしてちゃんとSwitch Botが動くことを確認します。

上手く行かない場合はRaspberry Piに接続して、

[email protected]:/etc/systemd/system $ journalctl -u blynk

blynkの出力を確認してちゃんと起動しているか、変なエラーが起こってないか確認してください。

/etc/systemd/system/blynk.serviceを再度編集する場合には、編集後必ず

[email protected]:~ $ systemctl daemon-reload

をして反映させるのを忘れないように。

以上でスマホからの操作に関しては終了です。

スマホ以外からBlynkを操作する

BlynkではWebAPIが公開されていて、これを使うとスマホのアプリがなくても Raspberry piを操作できるようになります。

Blynk HTTP RESTful API · Apiary

これを参考に、適当なターミナルを使える(Raspberry Piではない)PCから curlを使って試してみます。

$ curl http://blynk-cloud.com/<YourToken>/isHardwareConnected
true
$ curl http://blynk-cloud.com/<YourToken>/get/V1
["0"]
$ curl http://blynk-cloud.com/<YourToken>/update/V1?value=1
$ curl http://blynk-cloud.com/<YourToken>/update/V1?value=0

こんな感じ。<YourToken>は自分のプロジェクトのものに。 (実施にはtrueとかの表示のあとに改行がはいらないのですが見やすく変えてます。)

この最後から2番目のvalue 1を送った時にSwitch Botが動いたはずです。

単にブラウザでこれらのURLを開いても信号が送られて値も表示されるはずです。

$ curl http://blynk-cloud.com/<YourToken>/update/V1?value=1

だけすると、Raspberry Piの中でV1が1の状態のままになってしまいますが、 今回の設定では1が送られてくるかどうかだけで良いのでこれだけ送れば良いことにします。 (スマホ上のボタンの表記がちょっと変わりますが)

IFTTT経由でGoogle Homeから操作する

WebAPIが使えればそれをIFTTT経由で叩けるので Google Homeからも操作できるようになります。

IFTTTで新しいAppletの作成画面を開き、 If ThisにはGoogle Assistantを指定して マンションの入り口開けてとかの言葉を入れます。 (ドアフォンの解錠のところのSwitch Botを操作したかったため)

ちなみに解錠という言葉を入れてみましたが、近くの会場を調べることがデフォルトで入っていて 上手くIFTTTにつながってくれませんでした。(何度もやってれば出来ることもたまにありますが。)

あと、開けゴマというのを入れてみましたが、こちらももともと入っているようで、 アラビアンな音楽が流れてきました。

さておき、Thisの設定が出来たらThen Thatのところで、 Webhooksを選びます。

Webhooksでは

  • URL: 先程使ったURL
  • Method: GET
  • Content Type: text/plain
  • Body: 空白のママ

で設定します。

ただし、ここでURLは先程のhttp://blynk-cloud.com/…だと上手く動きません。 リダイレクトがかかっているからか、IFTTTからドメイン名で指定すると上手くいかないので IPアドレスを直接書く必要があります。

20190818_iftttfail.png

適当なターミナルでblynk-cloud.comのIPアドレスをチェックします。

$ host blynk-cloud.com
blynk-cloud.com has address 188.166.206.43

と出たのでURLには

http://188.166.206.43/<YourToken>/update/V1?value=1

と入れます。

20190818_iftttwebhook.png

これでIFTTTのAppletを保存してGoogle Homeにマンションの入り口開けてと呼びかけて Switch Botが動けばOK。

まとめ

Blynkというサービスを使ってネットワーク経由でRaspberry Piに命令を出し、 Switch Botを動かせるようにしてみました。

Blynkを使うことで、Raspberry Pi側の設定も簡単に出来、 スマホのアプリからも簡単に操作できる様になります。

また、WebAPI+IFTTTを使うことでGoogle Homeなどスマートスピーカーからも簡単に操作できる様にできます。

Raspberry Piをネットワーク経由で操作すると言うと、 Node.jsとかのライブラリを使ってTwitterやSlackの特定のメッセージに反応するようにしたり Webサーバーを建ててしまって直接WebAPIを受け取るようにしたり、 というのがよくありましたが、 特定のサービスに何か送らないといけなかったり、 直接Webサーバーだと固定IPとか付けないと外からアクセスできなくなります。

BlynkであればRaspberry Pi側での設定も簡単で、 スマホも使いやすいボタンを設置できるアプリがあるので とても良かったです。 IFTTT+Webhooksを使えばTwitterなどから操作する設定も簡単に出来ます。 スマートスピーカーからも。

ということでBlynkを使ってネットワーク経由でRaspberry Piに信号を送ってSwitch Botを操作する、 ということが出来るようになりました。

Blynkが思った以上に使いやすくて何でもできそうなので、今後Raspberry Piで なにかしたい時に簡単に実装できそうです。

今回はButtonで信号を送るだけでしたが、 Raspberry PiのCPUとかを監視したり、 湿温度計センサーを付けて湿温度計とする、みたいなこともすぐにできそうです。

ただし、ここでマンションの入り口を開けてみようと 外へ行って 自分の部屋番号を呼び出して スマホのボタンを押してみましたが、 Switch Botは動いているようなのに開かない。 どうやら、ドアフォンの解錠ボタンを押す前に呼び出しに出てからでないと駄目らしい。。。 もう一つ設置するか、Switch Botをネットワーク経由で操作できるようになった、ということに満足して辞めるか。。。

追記: 2019/08/18

ドアフォンの通話の方にもつけて外からスマホだけで家に入れる様にしました。 半分意地な感じ。。。

20190818_doorphone.jpg

こんな感じで下の通話ボタンのところにも別のSwitch Botを付けています。 ただ、このボタンは大きなボタンで、下側の方が押される様になっているのでちょっと設置が難しかったです。

単に上や横に付けると十分に押せませんでした。 もちろん、ボタン上に貼り付けてしまうと押せません。 下側になにか土台を設置して、というのが一番きれいですが流石にちょっと邪魔くさいので。

ということで、上の写真の様に斜めにしてなるべく真ん中下の方を押せるように設置しています。

このとき、Switch Botのもともとの貼り付け用のシールはバーの方側にあって、 それだとボタン部分に大きく張り付いてしまい上手く押せません。

なのでもとから付いている両面テープを一度剥がしてこんな感じで後ろの方に付け直しました。

20190818_switchbot.jpg

もとのを取り忘れましたが、シールの形を見て分かる通りバーがある側に付いていたものです。

後ろ側につけてしまうと、多少先が動くので通常はちゃんと先側で貼り付けた方が良いわけですが、 今回はこれでなんとか上手く動く様になってくれました。

これで、Blynkに通話ボタンを押すものも登録してあげればOKです。 実際に外から試してみましたが開けることが出来ました。

この状態であれば2つに分ける必要もないので、

main.cpp
1
2
3
4
5
6
7
8
9
10
11
import time

BLYNK_WRITE(V1)
{
    printf("Got a value for V%d: %s\n", V1, param[0].asStr());
    if(param[0].asInt() == 1){
      system("sudo python3 /home/pi/python-host/switchbot_py3.py --device <BLE MAC ADDRESS Answer>");
      time.slee(2)
      system("sudo python3 /home/pi/python-host/switchbot_py3.py --device <BLE MAC ADDRESS Unlock>");
    }
}

みたいな感じで1つのボタンで両方やってしまっても良いかもしれません。 sleepの時間は適当に調整が必要です。

追記ここまで

Sponsored Links
  1. blynk-library/BlynkHandlers.h at master · blynkkk/blynk-library

  2. 今回使っているRaspbianでは /usr/bin/killは存在しないのでExecStop/bin/killを使う必要があります。 CentOS 7の様に /usr/bin/killにしてしまうとstopしたりrestartするときに

    blynk.service: Failed to execute command: No such file or directory
    

    とか

    blynk.service: Failed at step EXEC spawning /usr/bin/kill: No such file or directory
    

    とかいうメッセージが出てしまいます。

    また、入っているkillコマンドが procps-ng のもので通常の CentOS 7などで使われている util-linux のものではないため、-pオプションとかがありません。

    そのままPIDを指定します。

Sponsored Links

« Raspberry PiからSwitch Botを操作する GitHubで新しいActionsが使えるようになっていたのでCI/CDをやってみた »