公式サービスは終了しているのでセキュリティ的に多少の不安があるシステムということは最初に断っておきます。
Blynkというサービスを当ブログではこれまでに数回紹介している。
それは自作スマートホームを実現するのに使い勝手の良いサービスだった。だが彼らは内容を刷新して儲けに走るようになった。
どういうことかというとBlynk LegacyからBlynk2.0というものに完全置き換えみたいにして無料または格安で使える範囲が著しく狭まったのだ。それまではBlynk Legacyという古いシステムだったが新しくしてユーザーからサブスクでお金をどんどん取ろうという仕組みだ。
Blynk LegacyというのはBlynk2.0ほどの利便性はないがローカルサーバーを自分で立てさえすれば只で無制限にウィジェット(IoT機器とやりとりする機能のようなもの)を作ることができるらしい。
一般的には自作IoT機器を作ったとしてもスマホとの情報のやりとりをするにはだいたいどこかのサービスの世話にならなければならずほとんど只ではなにもできない。
しかしBlynk Legacyのローカルサーバーを構築できればそれが只で無制限にできるようになる。ありがとうBlynk。
だがそのローカルサーバーを立てるというのがなかなか難関で数週間悪戦苦闘してようやく実現できたのでここに紹介する。
【関連】
今回のゴール
冒頭でも述べたようにBlynkサーバーを自前で立てればBlynkアプリ内で貨幣のように扱われているENERGYというのを無制限に自分に与えることができる。まるで神になったような気分にもなれる。
▼下の画像の電池マークの横に997,200とあるが、これが通常のBlynk Legacyだと初期状態では1000だったか2000だったか忘れたがそんなもんしかない。いくつかウィジェットを配置するともうカツカツになって課金に応じなければ使えなくなる。もっともウィジェットをどれか削除すればENERGYが復活する良心的設計ではあるが。
その神モードになってIoTデバイスを自分で好きなだけ作って家中に配置できるようになりましょうというのが今回のゴールだ。
ただしある程度前提条件がある。それなりにITリテラシーが備わっている必要がある。スマホしかイジったことないけど好きなだけ声でパソコンつけたり、声でWi-Fiなし旧型ルンバを動かしたりなどしたいというのはちょっと虫が良すぎる。
パソコン使えるのはもちろんのことプログラム(C言語ぐらい必須)も多少作れますとか、光回線引く手続きできてルーターの設定も調べながらでも自分でできますっていうくらいは最低限必要だ。つまり俺がその最低レベルでの具現者だと思っている。
ー追記 2022/11ー
2022年12月でそのレガシーサーバーのサービスが終了するというアナウンスがあるようだが、果たして自前サーバは今まで通り使い続けられるかが目下のところ(2022年11月)注目である。
ー追記ここまでー
Blynkローカルサーバーに必要な機器
Raspberry Pi
以前、別の記事ではNode-REDを常時動かすのにRaspberry Piが要ると書いたことがあるが、今回はBlynkのサーバーを動かすのにRaspberry Piが要る。
【参考】
必ずしもRaspberry PiでなくてもWindowsパソコンでもMacでも可能だがランニングコストを考えたらRaspberry Piがベストチョイスだ。
ラズベリーパイはWi-Fiのつかえるやつなら3でも4でもいいしZEROでもいけるはず。PICOはWi-Fi機能がないから基本的にはやめておこう。
だからNode-RED用に1個、Blynk用に1個と2個Raspberry Piを常時起動しておきたい。1個のラズパイで両方ループさせておくこともできなくはないだろうけどできればそれぞれで動かしておいたほうが無難じゃないかな。
それでも2個で1万数千円だ。中古でパソコン買うより安いぞ。
ESP32またはESP8266など
自作IoT機器を縦横無尽に活躍させるのが今回の趣旨なのでESP32やESP8266などのマイコンボードが要るがとりあえずサーバーを動かすだけならなくてもいい。
サーバーがいくら動いていても動かすデバイスがないと始まらないので一応ここに挙げただけ。
Blynkローカルサーバー立てるのに必要なサービス
Blynk legacy
Blynkレガシーのサーバーに必要なコンポーネントをネットからダウンロードするだけだし、すべて無料だから楽しい世の中になったものだ。
Blynkローカルサーバー立てるまでの手順
いろいろネットの情報を見まくっておそらく10数件のサイトを見たし海外のサイトも見たしYouTubeもいろいろ見たが結局最後はここのサイトを参考にしてうまくいったので直接参照してください。
Raspberry Pi
ラズビアンOSのインストール
Raspberry PiのOSインストールなんてけっこう前に最後にやったので忘れてしまっているが、↓ここの公式サイトからそれぞれのパソコンOSにしたがったセットをダウンロードしよう。
Raspberry Pi OS – Raspberry Pi
そうするとRaspberry Piイメージャーというアプリがダウンロードされるのでそれを実行するとイメージ書き込みツールが起動する。
このへんの流れについては以前のスマートロック作成に挑んだ記事でも述べているのでそちらに譲る。
固定IPアドレスにする
サーバーとして機能させるためにはIPアドレスを固定しておく必要がある。じゃないとクライアントデバイスがアクセスしたいときに違っていたら迷子になるから。
IPアドレスの固定についても上記の記事ですでに述べているのでここでは省略する。
リモートでパソコンから操作できるようにVNCの設定もしておこう。そのへんも上記記事の固定IPアドレス設定の項ですでに説明している。
Blynkサーバーをインストールして起動する
ここから先はリモートで通常のパソコンから操作するほうが楽なのでそれを前提に説明する。
参考サイトで説明していることの受け売りではあるが、
- JAVA8をインストールする。ディレクトリは/home/piでもよし、新しく作ってもよし。
sudo apt install openjdk-8-jdk openjdk-8-jre
- Blynkローカルサーバーライブラリをダウンロードする。オリジナルのサイトはすでにサービス終了してしまっているので奇特な有志の方のサイトからいただく。
$ wget “https://github.com/Peterkn2001/blynk-server/releases/download/v0.41.16/server-0.41.16-java8.jar”追記 2023-05-01
正式サービス終了しているにも関わらずアップデートされていたのはなぜなのだろうwget "https://github.com/Peterkn2001/blynk-server/releases/download/v0.41.17/server-0.41.17.jar"
- Blynkサーバー起動する(ただしjabaのランタイムバージョンによるエラーになる☆参照)
$ java -jar server-0.41.16-java8.jar -dataFolder /home/pi/Blynk追記 2023-05-01
java -jar server-0.41.17.jar -dataFolder /home/pi/Blynk
うまく起動できると以下のようなメッセージが表示されるはず
Blynk Server successfully started.
All server output is stored in current folder in ‘logs/blynk.log’ file.
☆うまく起動メッセージが表示されない場合にはjavaのランタイムバージョンが古い可能性があるらしいということをchatGPTに教えてもらった。そしてjavaのランタイムバージョンを上げる呪文もついでに教えてもらったデタラメが以下。
LinuxでJavaランタイムを最新にするには、まずJavaの公式ウェブサイトから最新のバージョンをダウンロードします。その後、以下の手順でインストールします。
1. ターミナルを開きます。
2. `sudo add-apt-repository ppa:openjdk-r/ppa` を実行し、OpenJDKリポジトリを追加します。
3. `sudo apt-get update` を実行して、パッケージリストを更新します。
4. `sudo apt-get install openjdk-16-jdk` を実行して、OpenJDK 16をインストールします。これでJavaランタイムが最新のバージョンに更新されます。バージョン番号は必要に応じて変更してください。
以下を1行ずつ実行したらうまくいった。
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install openjdk-11-jdk
このあともう一度以下のコマンドを打てば実行できた。
java -jar server-0.41.17.jar -dataFolder /home/ユーザー名/Blynk
Blynkローカルサーバーが自動起動されるように設定する
Raspberry Pi起動時にBlynkサーバーも自動で起動するように設定する。
crontab -e
エディタが開くので一番下の行までカーソルを進めて以下追加する。
@reboot java -jar /home/pi/server-0.41.16 -java8.jar -dataFolder / home / pi / Blynk &
@reboot java -jar server-0.41.17.jar -dataFolder /home/ユーザー名/Blynk
crontabというのは定期実行させたいコマンドを入れておくファイルで@rebootという頭の文字がおそらく起動時に実行するという意味だろう。
保存してエディタを閉じる。CTRL+O→エンターで保存。 CTRL+Xで閉じる。
管理者としてのサーバー操作はどこから
Raspberry Piの端末画面でブラウザを開いてttp://127.0.1.1:9443を開くと管理画面が開けるのでそこでいろいろ設定できる。(ttpの左にhを入れる)
オール英語なのでよくわからんからあまりゴチャゴチャ触りすぎないほうが無難。
サーバー管理画面への認証についてはここには残さない。
メール送信できるようにする
すでにBlynk Legacyを使ったことがある人ならわかると思うが、スマホアプリで新しいプロジェクトを創ると最初にTokenを通知するメールが届く。
これをRaspberry Piにやらせるように設定する。
インストールしたディレクトリにmail.propertiesというのがあるはずなのでそれをエディタで開く。
sudo nano mail.properties
以下追記
ディレクトリにはmail.propertiesができていないのでホームディレクトリに(Blynkのディレクトリではなく同じ並び)mail.ptopertiesを作る。
エディタで開き以下を追加する。この文言はBlynkサーバーをウェブで開くとmail.propertiesの雛形として予め登録してある見本である。
mail.smtp.username=xxxxxx@gmail.com
mail.smtp.port=587
mail.smtp.password=パスワード
mail.smtp.auth=true
mail.smtp.starttls.enable=true
mail.smtp.timeout=120000
mail.smtp.host=smtp.gmail.com
mail.smtp.connectiontimeout=30000
ファイルの中で以下の2行を変更する。
mail.smtp.username=xxxxxx@gmail.com
mail.smtp.password=パスワード
これはTokenの送信元に使うメアドで、なぜかgmailがいいとどの参考サイトも異口同音に言っているのでそれに従っておいたほうが無難かもしれない。ここに入れるメールアドレスは自分の普段使っているgmailアドレスで構わない。
ただ2段階認証を設定している場合にはエラーになってしまうのでGoogleのセキュリティ設定のページでアプリ固有のパスワードというのを設定してそれを入れるようにしよう。▼ここを参考にしてください。
アプリ パスワードでログインする – Google アカウント ヘルプ
さらに追記。
仮に2段階認証を回避するアプリ固有パスワードを設定してもBlynkアプリでの新規プロジェクト作成時のメール送信ができなかった。そうするとプロジェクト固有のTOKENがわからずプログラムに埋め込めないという心配があるが大丈夫。
アプリのプロジェクト設定画面内にTOKEN一覧をコピーするボタンがあるのでそれで一旦クリップボードにためておいて別のアプリ、例えばGoogle Keepでもなんでもとにかくパソコンでも見られるアプリに保存しておく。
そしてパソコンで開いてTOKEN一覧を参照して必要なTOKENを取り出して使えばよい。
ルーター
ポート転送の設定
Blynk Legacyのアプリを家の中だけでしか使わないのならここの設定は不要だがそれではせっかくのホームオートメーションがいまいち面白くないものになる。
どうせなら外出先からもコントロールしたいものだ。
ポート転送といったりポートフォワーディングといったりポート開放といったりするがどれも意味は同じ。
Raspberry Piに設定した固定IPアドレスとポート番号9443,8080,443の3つでポート転送の設定をするように説明してくれていたサイトがあったがどこのサイトだか忘れた。▼下記サイトがその1つ。
【トラブルシューティング】Blink local Server をRaspberry Piで作る-紆余曲折の記録
9443ポートについてはアプリからのログインのときに必要になる。
ポート開放のやり方はそれぞれのルーターの説明書なりを見てそれに倣ってやってほしい。
NUROルーター&自前ルーターの場合
自分がつまずいた点として1つ備忘に残しておく。
我が家はNURO光でプロバイダーはSo-netを利用している。So-netから送られて使っているルーターはF660というやつでそれなりにスピードには満足しているがIoT機器が増えてくるとルーティング機能だのファイアーウォール機能だのというのを1台のルーターで賄うのはどうも大変らしくしばしばWi-Fiが切れるという事態に直面した。
そこでTP-LinkのメッシュWi-Fi機能もあるゲーミングルーターARCHER AX73というのを買って増設した。
2重ルーターというのは禁じ手なので回避する方法はこちらのブログを参考にした。
【NURO光の設定】二重ルーター問題を解決💚ONU(F660A)のDMZ設定で自前ルーター(Archer AX73)を「ルーターモード」で使う! | Cafe Fuew|ふうカフェ
で何につまずいたかというと、ポートフォワーディングあるいはポート開放の設定を新しいTP-Linkのルータだけでしかやらなかったのでうまく外から自前のBlynkサーバーにアクセスできなかったのだ。
正解は新しいルーターでポート開放するのはもちろんのこと、今までの(光回線と直接つながっているほうの、さらにいうとより家の外に近いほうの)ルーターでもポート開放の設定をする。そのとき開放する相手IPアドレスは内側にあるRaspberry PiのIPアドレスではなく新しいルーターのWAN側アドレスを指定することだ。
ここ大事。うまくいった。
スマホ
Blynk Legacyアプリを入れる
Blynk LegacyアプリはアイフォンのAPPストアでもAndroidのPlayストアでも手に入るが最新版では新しいアカウントが作れないようになっている。
だから少し古いバージョンのものをインストールする必要がある。
とりあえずAndroスマホだけで完結するやり方を1個だけ述べておく。なぜならここはアンドロ集団だから。iPhoneで古いバージョンのアプリを入れる方法は知らん。AndroidアプリでできたあとはiPhoneで同じアカウント同じサーバーにログインできるからまずはAndroidスマホでやってみるべし。
以下ような前バージョンアプリをアーカイブ(?)だかしてくれているサイトにアクセスする。
APKPure APKを通じてオンラインで APK をダウンローダする | APKPure公式サイト
そこでBlynkを検索してアカウント作成できそうでなるべく新しいアプリをダウンロードする。ダウンロードしたインストールファイルAPKを実行する前に新しいバージョンのアプリが入っていたらアンインストールしておくこと。
アカウントの登録でローカルサーバーを指定
アカウント作成で画面下の方にある・・・が縦に並んでいるアイコンをタップすると現れるBLYNKとCUSTOMというのでCUSTOMのほうを選び、IPアドレスにRaspberry PiサーバーのIPアドレスを入れる。
【追記】アプリから新規アカウント登録がどうしてもできなかったらサーバーのホームディレクトリにファイルを一個つくってやる技がある。以下参考サイト
(レガシー)Blynkユーザー救済企画!WindowsでBlynkローカルサーバーを動かそう! – 知的好奇心 for IoT
そうするとRaspberry Pi内にアカウントが作成されるのでプロジェクトを1個作ると自分宛てにTOKENお知らせメールが届くはずだ。
万一メールがちゃんと届かなくてもRaspberry Piの端末画面でブラウザを開いて127.0.1.1:9443を開くとちゃんと管理画面が開けるのでわかる。
管理画面で最初にユーザー名とワスワードを聞かれたらadmin@blynk.ccとadminを入れれば入れるはず。
ユーザーリストには今登録したメールアドレスが入っているはず。そのアドレス部分をクリックすると画面が変わる。
▼変わった画面で下にスクロールしていくと今作ったプロジェクトのTOKENが現れるのでそれをコピペして使えばよい。
自分ちのグローバルIPアドレスで登録
さて先程のBlynk Legacyアプリでローカルアドレス(例えば192.168.0.182)でログインすると家の中では良いものの外出して自宅ルーターから離れたら使えなくなるのではないかという疑問を感じた方は鋭い。
そのとおり。使えなくなる。それは困る。
だから先程のBlynk Legacyアプリのログインでは自分の自宅のグローバルアドレスを指定する。ただしWi-Fiにつながったままだとグローバルアドレス指定すると自分の家から自分の家に電話をかけるようなものでつながらない。
だからそのときは一旦Wi-Fiをオフにすること。iOSアプリを開くときのオートメーションの記事でも多少説明しているのでこちらも参照してみてほしい。
つまり自宅にいるときにBlynkを操作したかったらWi-Fiをオフにし、出先ではWi-Fiをオンにしても良いし、しなくても良いしというわけだ。
家の中からの操作マクロ
それではちょっといちいち切り替えるのが面倒くさいじゃないかというツッコミをする人いるかな。っていうかここまで書いてきた記事をまともに読む人って何人ぐらいいるんだろ?
一応最後まで書いておくけどそれを簡単に実現するマクロがある。っていうかマクロ実行できるアプリを入れておく。
マクロドロイドっていうアプリで実現可能だ。
MacroDroid – デバイス自動化
ArloSoft無料posted withアプリーチ
このアプリは3段の設定項目がある。
- トリガー
- アクション
- 条件
というのをそれぞれ設定する。詳細はもっと詳しくこれだけ説明してくれているサイトを参考にしてほしい。
では手順に移る。
- マクロの追加をして作成開始する
- トリガーでアプリ起動時を選び、さらにBlynkアプリの起動時という形にする
- アクションではWi-Fiをオフにするを選ぶ
- 条件ではWi-Fi接続中という条件を選び自宅のSSIDを選ぶ。つまり自分ちのWi-Fiに接続しているときだけこのマクロが発動するようにするのだ。
ではBlynkアプリを終了させたときに再びWi-Fiに接続したいと思ったらどうするか。これももう一個マクロを作っておく。
- トリガーでアプリ終了時というのを選び、さらにBlynkアプリを選ぶ
- アクションではWi-FiをONにする
- 以上
簡単だ。これで家の中にいても外にいてもBlynk Legacyアプリが正常に起動して自分の家のRaspberry Piにちゃんと接続できる。
【追記】iOS用の設定に関しては無視していたが、一応記事を書いたので必要なら参照ください。
追記 パソコンからコマンドラインで操作する方法
以下のようにターミナル画面から打つ。V1のところとvalue=0のところはウィジェットによって適宜変える。
curl http://サーバーのIPアドレス:8080/<トークン>/update/V1?value=0
デスクトップにショートカットを置いてサクッと機器の状態を切り替えたいときもあるだろう。
デスクトップにショートカットを新規作成しつつ上記のコマンドを入れて適切なタイトルに変えつつ、ついでにアイコンもわかりやすいものに変えれば使える。
まとめ
使い放題が実現できて冒頭述べたように神になったような気分をちょっとだけ味わっているが、根が貧乏性なためあまり贅沢な使い方を思いつかないwww
ボタンも地味なボタンといろいろ設定できるボタンとあるが、しばらく地味なボタンを無条件に選んでいた。
いいんだよ、もっと自分を開放しても。なんて思っても急に開放できない。
慌てずにいろいろ作り込んで行こう。
追記 【重要】
設定ファイルのバックアップ
ラズベリーパイで稼働しているBlynkがときどき暴走かなにかわからないが反応しなくなることがある。
たいていはラズベリーパイの電源を切って(強制的に電源を抜く)つなぎ直せば復旧するんだが、あるときなんど再起動してもラズビアンそのものが起動しなくなったことがあった。
それってラズビアンの入れ直しからやらなければならず絶望を感じたんだ。
自分のこの記事を見ながらやったらあっさり上手く出来てよかった。それでもBlynkのウィジェットはスマホでチマチマと作り直しだから大変だ。
そこで次回Blynkサーバーを入れ直ししなければならなくなったときのためにバックアップを取っておこう。
Blynkのディレクトリにある「メールアドレス.Blynk.user」というJSON形式のテキストファイルをラズベリーパイから別のパソコンにコピーしておこう。
そうすれば多分ではあるが次回Blynkを入れ直したときにこのファイルをおなじディレクトリに戻すだけで回復できるのではないかと思う。自分もまだ回復工程はやったことないから予想ではあるが。
そのときメールアドレスはちゃんと一致させよう。
このファイルはスマホでウィジェットをいじったらこまめにバックアップしておこう。
Blynkアプリ(Android版)のバックアップ
Blynkアプリは旧バージョンのAPKファイルをどこかに保管しておこう。
最新(といってもすでに更新はされなくなっているが)のBlynkクライアントアプリだと新規にユーザー登録ができなくなっている。
旧バージョンのBlynkアプリ、具体的にはBlynk (legacy)_2.27.29_apkcombo.com.apkあたりのバージョンを保存しておくと次回やるとき簡単にいく。
追記
自宅のISPが動的IPアドレスになってしまい外部から繋がらなくなるようになったので、アプリは手動で入れ直すとしてもせめてデバイスだけでも自動でIPアドレス更新ができないものかと調べてできたもの。