sakura.io + Raspi HAT のセットアップと動作確認 Python3.6


# 使用機器
- Raspberry Pi3 model B+
- [sakura.ioモジュール（LTE）SCM-LTE-01](https://sakura.io/product/module_lte.html)
- [sakura.io HAT for Raspberry Pi SCO-RPI-01](https://sakura.io/product/rpihat.html)


# sakura.ioモジュール「SCM-LTE-01」とは

- 購入時点でモジュールにSIMカードが装着済みで、ソフトバンクのLTE回線で通信が可能（Wi-Fi環境がなくとも、国内であれば、だいたいどこでも通信が可能）
  - 接続先は「さくらインターネットデータセンタ」のみ 
  - Azureなどのクラウドサービスと連携したい場合は、さくら側のサービスを経由する必要あり → [連携サービス一覧](https://sakura.io/docs/pages/spec/platform/data-integration/index.html)
  - かなりゴツイアンテナ2本が付属
- 通信料は「さくらインターネット」に対してポイントという形で支払い
  - SCM-LTE-01の初回モジュール登録時に 10,000 ポイントが付与される（付与まで多少のタイムラグあり）
  - クレジットカード以外でもポイントチャージをする方法あり
　- ポイントは20,000ポイント=100円で、20,000ポイント単位で購入可能。1ポイント
  - **1モジュールの1ヵ月の基本料金は60円**（ポイントじゃなくて日本円での支払い）。ちなみに基本料金を支払うと10,000ポイントが付与されます。2019/02/08時点
  - 通信1回で1ポイント（=0.05円）を消費。

データの送信は、さくらインターネットに対してのみしかできませんが、その分、通信は簡単にできるようになっています。

# スタートガイドに従ってセットアップ

sakura.ioの公式HPに記載の [HAT for Raspberry Pi スタートガイド](https://sakura.io/docs/pages/guide/startup-guide/rpihat.html) に従ってセットアップを進めます。前半はサクサク順調に進むものの、制御ライブラリの動作確認として行なう「デバイスID取得」で、つまずいてしまいました。

```Python:SCM-LTE-01のデバイスIDの取得
import sakuraio
from sakuraio.hardware.rpi import SakuraIOSMBus
sakuraio = SakuraIOSMBus()
print(sakuraio.get_unique_id())
```

上記のコードを実行してみるものの失敗・・・。

```
pi@raspi01:~ $ python3
Python 3.6.7 (default, Nov 27 2018, 19:37:01)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sakuraio
>>> from sakuraio.hardware.rpi import SakuraIOSMBus
>>> sakuraio = SakuraIOSMBus()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.6/site-packages/sakuraio/hardware/rpi/__init__.py", line 8, in __init__
    import smbus
ModuleNotFoundError: No module named 'smbus'
```

色々と調べてみると、どうやら Python3.6 では smbus というI2C関連のモジュールが対応していないという情報が・・・。よって、Python3.6 以降では smbus2 を使いなさい、ということらしいです（たぶん Python 3.5 では問題ないのでしょう・・・）。

そこで、次のように smbus2 を導入します。

```
pi@raspi01:~ $ sudo pip3 install smbus2
Looking in indexes: https://pypi.org/simple, https://www.piwheels.org/simple
Collecting smbus2
  Downloading https://www.piwheels.org/simple/smbus2/smbus2-0.2.3-py2.py3-none-any.whl
Installing collected packages: smbus2
Successfully installed smbus2-0.2.3
```

それにあわせて応急処置的ですが「smbusが見つからない」とエラーを吐いていたプログラム `/usr/local/lib/python3.6/site-packages/sakuraio/hardware/rpi/__init__.py` の内容を、次のように書き換えました。

- 8行目：`import smbus` を `import smbus2 as smbus` に

再度、動作確認用のコードを実行してみます。

```
pi@raspi01:/usr/bin $ python3
Python 3.6.7 (default, Nov 27 2018, 19:37:01)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sakuraio
>>> from sakuraio.hardware.rpi import SakuraIOSMBus
>>> sakuraio = SakuraIOSMBus()
>>> print(sakuraio.get_unique_id())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python3.6/site-packages/sakuraio/hardware/commands/operation.py", line 62, in get_unique_id
    return self.execute_command(CMD_GET_UNIQUE_ID, as_bytes=True).decode("ascii")
  File "/usr/local/lib/python3.6/site-packages/sakuraio/hardware/base.py", line 49, in execute_command
    self.start(False)
  File "/usr/local/lib/python3.6/site-packages/sakuraio/hardware/rpi/__init__.py", line 23, in start
    self.response = self.bus.read_i2c_block_data(SAKURAIO_SLAVE_ADDR, 32)
TypeError: read_i2c_block_data() missing 1 required positional argument: 'length'
```

すると先ほど失敗していた `sakuraio = SakuraIOSMBus()` は実行できるようになりましたが、その次のところで、またもエラーが発生。

smbus から smbus2 にバージョンアップしたことで、`read_i2c_block_data`　関数の引数の数が変わったようです。smbus2の [リファレンス](https://pypi.org/project/smbus2/) を参照したところ、第2引数としてオフセットを与えないとダメなようです。そこで、またも応急処置的ですが `/usr/local/lib/python3.6/site-packages/sakuraio/hardware/rpi/__init__.py` に手を加えます。

- 23行目 `self.response = self.bus.read_i2c_block_data(SAKURAIO_SLAVE_ADDR, 32)` を `self.response = self.bus.read_i2c_block_data(SAKURAIO_SLAVE_ADDR, 0, 32)` に

再度、動作確認用のコードを実行してみます。

```
Python 3.6.7 (default, Nov 27 2018, 19:37:01)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sakuraio
>>> from sakuraio.hardware.rpi import SakuraIOSMBus
>>> sakuraio = SakuraIOSMBus()
>>> print(sakuraio.get_unique_id())
1xxxxxxx30
```

デバイスIDの取得に成功ました。

ちなみに、このデバイスIDは SCM-LTE-01 の表面に貼ってあるシールの SER の項目の印字と一致します。つづいて、送信テストにもトライしました。

```
pi@raspi01:/usr/bin $ python3
Python 3.6.7 (default, Nov 27 2018, 19:37:01)
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sakuraio
>>> from sakuraio.hardware.rpi import SakuraIOSMBus
>>> sakuraio = SakuraIOSMBus()
>>> sakuraio.enqueue_tx(1, 123)
>>> sakuraio.send()
```

クライアント側ではエラーがでていないようです。

sakura.io のコントールパネルで、ちゃんとsakura.io側にデータが届いたのかを確認します。

![2019-02-06_21h12_23.png](https://qiita-image-store.s3.amazonaws.com/0/152805/214eade4-bda4-c823-0159-b48f22327078.png)

成功です！


[HAT for Raspberry Pi スタートガイド](https://sakura.io/docs/pages/guide/startup-guide/rpihat.html) の最後まで到達しました。