MicroPythonでBlynk

#免責
この記事に従って発生した如何なる損害も筆者は負うことができません。ご免なさい。

#はじめに
使い勝手が良いのでMicroPythonがお気に入りです。
ここではBlynkに挑戦します。
MicroPythonをUbuntuなどにインストールするには[こちら](https://qiita.com/tab4moji/items/c22279ff397c7f2782cc)を参考にしてみて下さい。

#目的
MicroPythonで[Blynk](https://blynk.io/)したいと思います。

#準備
ここでは説明しませんが、Blynkのアカウントはスマホを操作して用意しておいて下さい。
デバイス(または母艦)に既にインストールしてあるMicroPythonにBlynkLibが使うパッケージを用意しておきます。struct、time、os、socketを使えるようにしておきます。

```shell-session:Blynkが使うPythonパッケージをインストール
$ micropython
MicroPython v1.11-37-g62f004b on 2019-06-05; linux version
Use Ctrl-D to exit, Ctrl-E for paste mode
>>>
>>> import upip
>>> upip.install("struct")
>>> upip.install("time")
>>> upip.install("os")
>>> upip.install("socket")
>>>
```

#どのBlynkLibパッケージを使うか
残念ながら、公式版のBlynkLibはimportするとエラーになります。osパッケージのunameにアクセスしようとして、エラーになります。
issue-27が上がっていますが公式版は修正されておらず、jsikorskyさんが修正してくれていますので、そちらを使います。

###公式版(動かない)
https://github.com/vshymanskyy/blynk-library-python.git

```shell-session:公式版Blynk(動かない)
$ micropython
MicroPython v1.11-37-g62f004b on 2019-06-05; linux version
Use Ctrl-D to exit, Ctrl-E for paste mode
>>>
>>> import upip
>>> upip.install("blynk-library-python")
>>>
>>> import BlynkLib
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "~/.micropython/lib/BlynkLib.py", line 49, in <module>
AttributeError: 'module' object has no attribute 'uname'
>>>
```

###jsikorskyさん版(動く)
issue-27の対応をしているので、エラーが出ません。
https://github.com/jsikorsky/blynk-library-python.git

```shell-session:jsikorskyさん版(動く)
$ # UNIX版MicroPythonの場合
$ mkdir -p ~/.micropython/lib
$ wget -O ~/.micropython/lib/BlynkLib.py https://raw.githubusercontent.com/jsikorsky/blynk-library-python/master/BlynkLib.py
$ micropython
MicroPython v1.11-37-g62f004b on 2019-06-05; linux version
Use Ctrl-D to exit, Ctrl-E for paste mode
>>>
>>> import BlynkLib

    ___  __          __
   / _ )/ /_ _____  / /__
  / _  / / // / _ \/  '_/
 /____/_/\_, /_//_/_/\_\
        /___/ for Python v0.2.0 (linux)

>>>
```

#サンプル(virtual_write.py)を試す
スクリプトからスマホへ時刻を秒にして送るBlynkLibのサンプルを試します。

###スマホのBlynkアプリにMyDeviceを作る
スマホのMyDeviceに"Labeled Value"を"INPUT V0"で作ります。
必死に探せば"AUTH TOKEN"を自分にメールしてくれるボタンが見つかるので押します。このトークンを後でスクリプトに書き込みます。
トークンを手に入れたら、再生ボタンでデバイスを動かしておきます。

###Blynkサンプルを用意する
スクリプトをダウンロードしてコードの中にメールでゲットした"AUTH TOKEN"を書き込みます。

```shell-session:Blynkサンプル
$ wget -O virtual_write.py https://raw.githubusercontent.com/jsikorsky/blynk-library-python/master/examples/virtual_write.py
$ vi virtual_write.py #ここで編集
```

###MicroPythonでサンプルを動かす
準備できたのでvirtual_write.pyをimportして実行します。
スクリプトが正しく動くと、1秒毎にBlynkアプリに"time:xxxx.xxx"と表示されます。
スクリプトを再起動するにはMicroPython自体を再起動します。

```shell-session:Blynkサンプルを実行
$ # UNIX版MicroPythonの場合
$ micropython
MicroPython v1.11-10-g84f1067f7 on 2019-06-02; linux version
Use Ctrl-D to exit, Ctrl-E for paste mode
>>> import virtual_write

    ___  __          __
   / _ )/ /_ _____  / /__
  / _  / / // / _ \/  '_/
 /____/_/\_, /_//_/_/\_\
        /___/ for Python v0.2.0 (linux)

1 sec elapsed, sending data to the server...
1 sec elapsed, sending data to the server...
1 sec elapsed, sending data to the server...
1 sec elapsed, sending data to the server...
1 sec elapsed, sending data to the server...
1 sec elapsed, sending data to the server...
1 sec elapsed, sending data to the server...
```

#デバイスならバイトコードがお勧め
mpy-crossを使って\*.pyから\*.mpyにしておくとリソースの消費が少なくなるようです。
特にデバイスではライブラリ類は小さくしたいものです。
[UNIX版のMicroPythonでは-mcache-lookup-bcオプションを付けた方がよさそうです。](https://github.com/micropython/micropython/issues/2896)

```shell-session:mpy-crossでバイトコードにする(軽量化)
$ # UNIX版MicroPythonの場合
$ pushd ~/.micropython/lib
$ mpy-cross -mcache-lookup-bc BlynkLib.py
$ mv BlynkLib.py BlynkLib.backup # *.pyが優先されるようなので移動
$ popd
```

こうするとデバイスでも色々と大きめのパッケージも使えるようです。

#参考
 * [Get started with Blynk in 5 minutes](https://blynk.io/en/getting-started)
 * [Error when importing .mpy module #2896](https://github.com/micropython/micropython/issues/2896)