Raspberry Pi 3 と SmartTag と Ambient とで室温を可視化


先ずは、参考にした情報はこちら。

- http://blog.nambo.jp/2013/07/23/raspberrypi-mac-osx/
- https://qiita.com/mascii/items/0d1a280ac58ed8f6f999
- https://curecode.jp/tech/raspberrypi-ramdisk/
- https://qiita.com/AmbientData/items/d20d0ff0938ed7fbfd47

先人の苦労に感謝しつつ、以上を踏まえてまっさらな状態からグラフを見れるところまでの構築をまとめてみました。

## Raspberry Pi の準備

使用する Raspberry Pi は Raspberry Pi 3 Model B です。
Raspberry Pi の設定には Mac を用います。

### OSのダウンロード

https://www.raspberrypi.org/downloads/raspbian/ から Raspbian Stretch Lite を ダウンロードします。

Mac の Terminal から、ダウンロードしたOSイメージをSDカードに書き込みます。
当方の環境ではSDカードスロットは disk4 でした。(ディスクの番号を間違えて `dd` するとMacのディスクが壊れます)

```console
$ sudo diskutil list
$ sudo diskutil unmount /dev/disk4s1
$ sudo dd bs=16m if=2017-04-10-raspbian-jessie-lite.img of=/dev/rdisk4
```

書き込みが終わるとSDカードのパーテーションがマウントされるので、追加の設定をします。
Raspberry Pi  の宅内ネットワークへの接続は無線を使用します。有線を使用する場合は `wpa_supplicant.conf` の作成は不要です。

```console
$ touch /Volumes/boot/ssh
$ nano /Volumes/boot/wpa_supplicant.conf
```

`wpa_supplicant.conf` の内容はこんな感じです。

```text:wpa_supplicant.conf
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="アクセスポイントのSSID"
    psk="アクセスポイントのパスワード"
}
```

### Raspberry Piにログイン

Mac からSDカードを取り出して Raspberry Pi にセットし、電源を入れます。
少し待ってから、Mac の Terminal からリモートログインします。

```console
$ ssh-keygen -R raspberrypi.local
$ ssh pi@raspberrypi.local
```

以降はリモートログインしている Raspberry Pi 上での操作です。

### 既存パッケージの更新

既定の mirrordirector.raspbian.org に繋がりにくいので近隣のミラーサイトに変更します。

```console
$ sudo nano /etc/apt/sources.list
```

`sources.list` の内容はこんな感じです。

```sourceslist:sources.list
deb http://ftp.jaist.ac.jp/raspbian stretch main contrib non-free rpi
#deb http://mirrordirector.raspbian.org/raspbian/ stretch main contrib non-free rpi
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
#deb-src http://archive.raspbian.org/raspbian/ stretch main contrib non-free rpi
```

パッケージを更新します。

```console
$ sudo apt-get update
$ sudo apt-get upgrade
```

### スワップを無効、ログディレクトリをRAMディスクへ

スワップを無効にします。

```console
$ sudo swapoff --all
$ sudo apt-get remove dphys-swapfile
```

ログディレクトリをRAMディスクにします。

```console
$ sudo nano /etc/fstab
```

`fstab` の最後の3行はこんな感じです。

```text:fstab
tmpfs	/tmp		tmpfs	defaults,size=64m,noatime,mode=1777	0	0
tmpfs	/var/tmp	tmpfs	defaults,size=32m,noatime,mode=1777	0	0
tmpfs	/var/log	tmpfs	defaults,size=32m,noatime,mode=0755	0	0
```

シスログに出力する項目を絞ります。

```console
$ sudo nano /etc/rsyslog.conf
```

`rsyslog.conf` の最後の40行はこんな感じです。

```text:rsyslog.conf
###############
#### RULES ####
###############

#
# First some standard log files.  Log by facility.
#
auth,authpriv.*			/var/log/auth.log
*.*;auth,authpriv.none		-/var/log/syslog
#cron.*				/var/log/cron.log
#daemon.*			-/var/log/daemon.log
#kern.*				-/var/log/kern.log
#lpr.*				-/var/log/lpr.log
#mail.*				-/var/log/mail.log
#user.*				-/var/log/user.log

#
# Logging for the mail system.  Split it up so that
# it is easy to write scripts to parse these files.
#
#mail.info			-/var/log/mail.info
#mail.warn			-/var/log/mail.warn
#mail.err			/var/log/mail.err

#
# Some "catch-all" log files.
#
#*.=debug;\
#	auth,authpriv.none;\
#	news.none;mail.none	-/var/log/debug
#*.=info;*.=notice;*.=warn;\
#	auth,authpriv.none;\
#	cron,daemon.none;\
#	mail,news.none		-/var/log/messages

#
# Emergencies are sent to everybody logged in.
#
*.emerg				:omusrmsg:*
```

起動時にRAMディスク上に既定のログファイルが用意されるようにします。

```console
$ sudo nano /etc/init.d/make-varlog-files
```

`make-varlog-files` の内容はこんな感じです。

```bash:make-varlog-files
#!/bin/bash
#
### BEGIN INIT INFO
# Provides:          make-varlog-files
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Required-Start:
# Required-Stop:
# Short-Description: Create /var/log/... files on tmpfs at startup
# Description:       Create /var/log/... files needed by system daemon
### END INIT INFO

#
# main()
#
case "${1:-''}" in
  'start')

    mkdir -p /var/log/ConsoleKit
    mkdir -p /var/log/samba
    mkdir -p /var/log/fsck
    mkdir -p /var/log/apt
    mkdir -p /var/log/ntpstats
    chown root.ntp /var/log/ntpstats
    chown root.adm /var/log/samba
    touch /var/log/lastlog
    touch /var/log/wtmp
    touch /var/log/btmp
    chown root.utmp /var/log/lastlog
    chown root.utmp /var/log/wtmp
    chown root.utmp /var/log/btmp

   ;;
  'stop')
   ;;
  'restart')
   ;;
  'reload'|'force-reload')
   ;;
  'status')
   ;;
  *)
   echo "Usage: $SELF start"
   exit 1
   ;;
esac

exit 0
```

```console
$ sudo chmod 755 /etc/init.d/make-varlog-files
$ sudo update-rc.d make-varlog-files defaults 01 10
```

その他、お好みの設定で仕上げます。

```console
$ sudo raspi-config
```

一度、再起動します。

```console
$ sudo reboot
```

## TI SensorTag の準備

TI SensorTag (CC2650STK) は[ここ](https://store.ti.com/cc2650stk.aspx)などから入手できます。

SensorTag に装着されているボタン電池は (CR2032) 、念のため、新しいものに入れ替えておきます。(電池が弱っているとセンサーの値を取得しても0だったり、スマートフォンアプリの Sensor View が正しく表示されなかったりします)

SensorTag 用のスマートフォンアプリ([iOS](https://itunes.apple.com/jp/app/ti-sensortag/id552918064)と[Android](https://play.google.com/store/apps/details?id=com.ti.ble.sensortag))を使って、ファームウェアを最新にしておきます。(ファームウェアのバージョンが古いとバッテリーレベルの取得に失敗してプログラムが終了したりします)

## Ambient の準備

https://ambidata.io/ でアカウントを作成し、Myチャネルで SensorTag の値を受け取るチャネルを作ります。
作成したチャネルの `チャネルID` と `ライトキー` は後で使うので控えておきます。

作成したチャネルの設定を開いて、データー名を設定しておくと、チャートを追加するときにわかりやすいです。

  - データー1 … 温度
  - データー2 … 湿度
  - データー3 … 気圧
  - データー4 … バッテリー
  - データー5 … 照度

そして、チャートをお好みの設定で追加します。

## Raspberry Pi にプログラムをインストール

#### 依存するツールをインストール

```console
$ sudo apt-get install python3-pip
$ sudo pip3 install bluepy
$ sudo apt-get install redis-server
$ sudo pip3 install redis
$ sudo nano /etc/init.d/make-varlog-files
```

`make-varlog-files` はファイルの中の `chown root.utmp /var/log/btmp` の行の直後に、以下を追加します。

```bash:make-varlog-files
    mkdir -p /var/log/redis
    chown redis.redis /var/log/redis
    touch /var/log/redis/redis-server.log
    chown redis.redis /var/log/redis/redis-server.log
```

```console
$ sudo apt-get install git
$ sudo pip3 install git+https://github.com/TakehikoShimojima/ambient-python-lib.git
```

### プログラムのインストール

```console
$ git clone https://github.com/TakehikoShimojima/sensortag-ambient.git
$ chmod +x sensortag-ambient/cgi-bin/*.py
$ sudo mkdir -p /var/www/html
$ cd /var/www/html
$ sudo cp -r ~pi/sensortag-ambient/* .
```

### プログラムの動作確認

```console
$ cd /var/www/html
$ sudo python3 st2ambient2.py -i 10 -v -d
^C
```

Raspberry Pi と SmartTag が接続されてセンサーの値の取得が始まると、点滅していた SmartTag の LED が消灯します。
プログラムを止めるときは `CTRL+C` です。

### プログラムの設定

Webブラウザで `http://raspberrypi.local/` に接続します。

インストールしたプログラムとツールおよび SensorTag がそれぞれ正しく動作していれば、 SensorTag リストにその SensorTag のアドレスと信号強度 (rssi) が表示されます。

控えておいた `チャネルID` と `ライトキー` を入力して `設定` ボタンを押します。

### プログラムの自動起動

Raspberry Pi を起動したときにプログラムが自動的に実行されるようにします。

```console
$ sudo nano /etc/rc.local
```

`rc.local` の最後の4行はこんな感じです。

```bash:rc.local

(cd /var/www/html; python3 st2ambient2.py) &

exit 0
```

再起動します。

```console
$ sudo reboot
```

## 完成

5分に1回の間隔で SmartTag のセンサーの値が Ambient に送られます。
Ambient でセンサーの値はグラフ化され、ブラウザで閲覧することができます。
継続的に使うのであれば、 SmartTag のボタン電池を時々交換してあげる必要があります。

お疲れさまでした。

---

以上です。