raspberry pi による電力自立型の環境監視IoTターミナルの稼働実験

　昨今は、IoT流行りで家電品がみんなネットにつながるという状況ですが、「電気がない場所」の環境監視をしてみようという事で、電力自立型としてソーラー発電とバッテリによる環境監視ターミナルの稼働実験を1年にわたり実施してきました。その結果を報告します。

#1 ターミナルの作成
　仕様決定のために基礎実験として、raspberry pi の消費電力とソーラーパネルの発電力を図り、連続稼働の可能性調査の実験を実施後に、以下の仕様にてターミナルを作成して稼働試験を開始しました。

##1.1 主要構成部品
　単結晶シリコン ソーラーパネル 12V 50W (仰角 20°半固定)
　シールドバッテリー　　　　　　12V 50Ah 
　太陽電池充放電コントローラー　10A/12V タイプ
　降圧モジュール　　　　　　　　12V(in) : 5V/6A(out)
　raspberry Pi2 + wifi + DS18B20 one-wireタイプ防水センサー

　本体は、タッパー内に発電コントローラーとraspberry pi を収めて、排気ファンと吸気口を設置しました。センサーは外気温を計測しています。構成部品の決定に関する実験の詳細についてはここでは報告しません。

##1.2 センサー部分
 DS18B20 one-wire式防水温度センサーはラグ板にハンダ付けしました。これを図1に示します。

 ![sens.jpg](https://qiita-image-store.s3.amazonaws.com/0/216972/dd0d30a1-bf33-213a-5572-ee1812475221.jpeg)

　　　　　　　　　　　　図 1   センサーとの接続

次は、セットアップします。
raspberry pi の初期設定は省略してセンサー部分のセットアップをします。
最初にセンサーをGPIOの4番につないでいるのでconfigに記述します。

  sudo vi /boot/config.txt で最後の行に

```
  dtoverlay=w1-gpio-pullup,gpiopin=4
```

  と追記して保存の後
  sudo vi /etc/modules として、次の2行を最後に追記

```
  w1-gpio
  w1-therm
```

これでリブートして有効化します。

```
  sudo reboot
```

再起動してきたら
  ls /sys/bus/w1/devices/ とやると28-041643cd95ff が見えるので、

```
  cat /sys/bus/w1/devices/28-041643cd95ff/w1_slave
  b0 01 80 80 1f ff 80 80 a1 : crc=a1 YES
  b0 01 80 80 1f ff 80 80 a1 ?t=24812
```

これは、24.812℃ ってことらしい。どうやら温度が拾えているようです。

##1.3 組み立て
　基本的な部分ができましたので、組み立と配線によるセットアップをします。基本的な骨組みはL型鉄材をホームセンターで購入してソーラーパネルを半固定状態にして、その裏側にバッテリとターミナル本体を収めるという、さもありそうな形状にしてみました。これを図2に示します。

![hontai.jpg](https://qiita-image-store.s3.amazonaws.com/0/216972/0434dfa0-f0a3-4e16-ec56-bf3d9e24c5b0.jpeg)

　　　　　　　　図2  ターミナル(左:正面、右:裏側)

#2 サーバーへのデータの転送のための環境整備
　ターミナルの稼働試験ですが、データがサーバーに常に届いているという確認をするために、ターミナルとサーバー間の通信も行なっています。サーバーへの最短アクセスのために「鍵認証」による接続を行ないます。

##2.1 サーバーアクセス用「鍵」の作成
「鍵」はターミナルであるraspberry pi 2 側で作成します。以下で、3種類のマシンが登場します。MacBookは作業用のマシンで、pi@raspberrypi がターミナル本体のラズパイ、pi@xxxxxjp01がデータを受け取るサーバーマシンです。

```
MacBook:~ kkxxxx$ ssh pi@192.168.0.x    IoTターミナルにログイン
pi@192.168.0.x's password:
 --- 省略  ---
pi@raspberrypi:~ $ ssh-keygen　　　　パスワードなしの秘密鍵を作ります
Generating public/private rsa key pair.
Enter file in which to save the key (/home/pi/.ssh/id_rsa):　　
Enter passphrase (empty for no passphrase):       #リターンのみとします
Enter same passphrase again:       #リターンのみとします
!# セキュリティ的にはお勧めできない方法ですが、実験という事で。。
pi@raspberrypi:~ $ cd .ssh
pi@raspberrypi:~/.ssh $ ls     #  下記id_rsa が秘密鍵です
id_rsa  id_rsa.pub  known_hosts　　  id_rsa.pub が公開鍵でサーバーにセットします
pi@raspberrypi:~/.ssh $ sftp -oPort="10022" pi@xxxxx.jp　　サーバーにsftpログイン
 put id_rsa.pub　　　　　　　　　　　　　　　　　　　ファイルをput
quit
```

これで鍵が送れていますので、サーバーにログインして確認します。

##2.2 サーバーの設定
　sshと鍵ファイルのセキュリティはしっかり確認します。ミスると次回ログインできなくなります。

```
pi@raspberrypi:~ /.ssh $ ssh -l pi xxxxx.jp -p 10022  sshでログインします(まだパスワード)
passwd:
pi@xxxxxjp01:~> chmod 700 .ssh  　　セキュリティはきっちり700に
pi@xxxxxjp01:~> ls
bin  id_rsa.pub  public_html
pi@xxxxxjp01:~> cat id_rsa.pub >> .ssh/authorized_keys　　鍵束に追記します
pi@xxxxxjp01:~> cd .ssh
pi@xxxxxjp01:~/.ssh> ls -l
合計 4
-rw-r--r-- 1 pi users 396 6月 15 21:01 authorized_keys
pi@xxxxxjp01:~/.ssh> chmod 600 authorized_keys　　　鍵データはセキュリティ600にセット
pi@xxxxxjp01:~/.ssh> exit　
pi@raspberrypi:~ $
pi@raspberrypi:~ $ ssh -l pi xxxxx.jp -p 10022　　今度は鍵認証です
pi@xxxxxjp01:~> ls　　　　　　　　パスワードを聞いてきません。OKです
bin  id_rsa.pub  public_html
pi@xxxxxjp01:~> exit
Connection to xxxxx.jp closed.
pi@raspberrypi:~ $ exit
```

##2.3 計測データの成型
　計測データを整形してサーバーに転送してみます。作ったプログラムはdata.shです。

```
MacBook:~ kkxxxx$ ssh pi@192.168.0.x
pi@raspberrypi:~ $ cat ./data.sh

!#!/bin/bash
file="/sys/bus/w1/devices/28-041643cd95ff/w1_slave"
array=(`cat $file`)
temp=(`echo ${array[21]} | cut -c 3-7`)
tmp=(`echo ?"scale=3; $temp/1000.0" | bc `)
echo `date +"%Y/%m/%d %H:%M:%S"` $tmp > env.dat
#
scp -P 10022 ./env.dat pi@xxxxx.jp:/home/pi/
# rm env.dat
#
```

では、実際にシェルを実行してみます。

```
pi@raspberrypi:~ $ ./data.sh
./data.sh: 行 6: bc: コマンドが見つかりません
```

あらら、コマンドか無いって言ってますのて、電卓コマンドを入れます。

```
pi@raspberrypi:~ $ sudo apt-get install bc
---- リターンメッセージは省略 ----
pi@raspberrypi:~ $ ./data.sh ; ls -l
env.dat                    100%  27   0.0KB/s  00:00  
pi@raspberrypi:~ $ cat env.dat
2016/06/16 20:13:56 21.687
pi@raspberrypi:~ $
```

動いたようです。サーバーを確認してみましょう。

```
MacBook:~ kkxxxx$ ssh xxxxx.jp -l pi -p 10022
passwd:
pi@xxxxxjp01:~> ls
bin env.dat id_rsa.pub public_html
pi@xxxxxjp01:~> cat env.dat?
2016/06/16 20:13:56 21.687
pi@xxxxxjp01:~>
```

ターミナルと同じ内容のデータが届いているので大丈夫そうです。

##2.4 定時配送
cronを設定して、定期的にファイルをサーバーに送ります。

```
MacBook:~ kkxxxx$ ssh pi@192.168.0.x
pi@192.168.0.x's password:
pi@raspberrypi:~ $ crontab -e
no crontab for pi - using an empty one

Select an editor. To change later, run 'select-editor'.
 1. /bin/ed
 2. /bin/nano    <---- easiest
 3. /usr/bin/vim.tiny
Choose 1-3 [2]: 3
-----以下を入力(3を選択でvi エデッタが起動します)
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
MAILTO=pi
*/10 * * * * /home/pi/data.sh
:wq
```

で保存します。この設定は10分おきの意味ですので、時間になったら動作を確認します。

```
pi@raspberrypi:~ $ ls -l
合計 48
-rw-r--r-- 1 pi pi  27  6月 16 21:40 env.dat
pi@raspberrypi:~ $ cat env.dat
2016/06/16 21:40:02 20.937
pi@raspberrypi:~ $ exit
```

動作しているようです。サーバーを確認してみましょう。

```
MacBook:~ kkxxxx$ ssh -Y xxxxx.jp -l pi -p 10022
pi@xxxxxjp01:~> ls -l
合計 16
-rw-r--r-- 1 pi users  27 6月 16 21:28 env.dat
pi@xxxxxjp01:~> date
2016年 6月 16日 木曜日 21:28:47 JST
pi@xxxxxjp01:~> cat env.dat
2016/06/16 21:40:02 20.937　  <--- 同じファイルになっているのでOK
pi@xxxxxjp01:~> exit
Connection to xxxxx.jp closed.
```

##2.5 サーバー側の仕掛け
  今回は、ターミナル側の稼働実験なのでサーバー側の「見せる」環境構築話は別の機会に譲ります。
ファイルのタイムスタンプがサーバーとターミナルで違っていましたが、データそのものは、ファイル内の時間を使うので今回はスルーします。

#3 稼働状況
　稼働開始から1年間は無事に無停止稼働していましたが、2017年の夏の日照不足の影響で、10月の台風の時に電圧の下限制限にかかり停止してしまいました。これは、バッテリ電圧を低い状態で使用すると劣化を早めるという事らしく、コントローラの機能として11.5Vで給電が停止するようになっているようです。
数日後に再開電圧に達したらしく、自動復帰していました。稼働開始から、毎朝6時の給電電圧をプロットしたものが図3です。

![denatsu.jpg](https://qiita-image-store.s3.amazonaws.com/0/216972/152aee65-c1ec-1acb-d53f-7082abd140a6.jpeg)

　このターミナルの設置場所は、太陽光が期待できる所であればどこでもOKですが、日照不足が長期にわたる場合は、動作確認の必要があることと、春先の黄砂は結構汚れるので、ソーラーパネルの清掃は必要と思われます。
　清掃は水洗いでOKですが、水垢は結構付着するようなので、たまには洗剤などでソーラーパネル表面のふき取りが必要かもしれません。記載日の今日現在も稼働中です。