Pythonで作る簡単植物通知システム　Raspberry Pi + 水分センサ + Messaging API

# はじめに
もうすぐ:cherry_blossom:春:cherry_blossom:ですね。
Raspberry Piと水分センサを使用して植物の水分を検知し、乾いている場合はMessaging APIで通知する仕組みを作りました。

本記事はRaspberry Piと水分センサを使用して、Messaging APIで通知する簡単レシピ:four_leaf_clover:です。

## 構成
### 仕組み
水分センサを植物に取り付けてアナログ電圧を取得します。取得したアナログデータをデジタルデータに変換させて、しきい値で条件分岐を行い水分が少なかったら、Messaging APIで通知します。

**Raspberry PiのGPIO端子はアナログデータの入力ができないため、デジタルデータに変換させてあげる必要があります。**

今回はI2CデバイスとしてTexas Instruments社製のA/Dコンバーター「ADS1015」を使用します。また、その他のA/Dコンバーターとしては、「MCP3800」とかがよくRaspberry Piとの組み合わせで使われています。

**ADS1015は、12ビットのデータに変換するため4096の数値まで扱えます**


### 概要図
![LINEAPI.png](https://qiita-image-store.s3.amazonaws.com/0/221759/8fe67176-c724-aa9f-7a84-4b3d74fb2d7e.png)

- 部品一覧

| 部品      |   値段    |    備考    |
|:---------|:-----------|:-----------|
|ブレッドボード 　|	270	|１個　|
|ジャンパー線（オス-メス） 　　| 330		|４本　|
|ジャンパー線（オス） 　　| 350		|７本　|
|抵抗1w10kΩ 　　|	200	|１個　|
|ＡＤＳ１０１５使用１２ビット４チャンネルＡＤコンバータ 　　　　　　|	1,280	|１個　|
|GROVE - 水分センサ　　　　　|	580	|１個　|
**合計3,010円**


- 使用ソフト

| 名前     |   備考    |
|:---------|:---------|
|Python3 　|インストール済み		|
|Adafruit_ADS1X15 　|GitHubより取得		|
|Messaging API 　|Developer Trial（※）		|
（※）Messaging APIを検証用途で無料使用する場合は、「Developer Trial」または「フリー」プランより選択することができます。違いとしては「Developer Trial」の場合プッシュメッセージと応答メッセージが両方使えます。詳細については[公式のプラン・料金](https://at.line.me/jp/plan)をご確認ください。

### はんだ付け
**ADS1015を使用する場合はブレッドボードに取り付けるため、はんだ付けが必要です。**
![写真 2018-03-06 22 40 35.jpg](https://qiita-image-store.s3.amazonaws.com/0/221759/4714e443-c956-f325-93d4-8a377ed4fa60.jpeg)

## 配線
[Fritzing](http://fritzing.org/home/)で作成した図になります。
※GROVE - 水分センサのパーツは見つからなかったので他のパーツを使用。

![スクリーンショット 2018-03-06 01.15.11.png](https://qiita-image-store.s3.amazonaws.com/0/221759/c5850b6c-d0bd-43e4-2fec-04a5cb50e60d.png)

## Messaging API
[Messaging API](https://developers.line.me/ja/services/messaging-api/)はLINEが公開しているAPIです。

![スクリーンショット 2018-03-07 01.30.23.png](https://qiita-image-store.s3.amazonaws.com/0/221759/12040531-90a7-31be-b2f4-a2bd8e0c804b.png)

Messaging APIはプッシュメッセージと応答メッセージがありますが、本記事のプログラムはプッシュメッセージを使ってRaspberry Piから通知します。

**プッシュメッセージと応答メッセージ**
>
プッシュメッセージとは、任意のタイミングでユーザーに送信するメッセージです。応答メッセージとは、ユーザーからのメッセージに対して応答するメッセージです。

### 前提条件
Messaging APIを使用するためにはLINEアカウントが必要です。
**※また、PCでコンソールログインする場合は、LINEのアカウント設定で「ログイン許可」が有効になっている必要があります。**

### チャネルの作成
まずはじめに、コンソールにログインを行います。
[クイックスタート](https://developers.line.me/ja/docs/messaging-api/getting-started/)を参考にしチャネルを作成します。なお、初回ログイン時のみ、LINE Developersコンソールで開発者アカウントを作成します。

![スクリーンショット 2018-03-06 22.49.29.png](https://qiita-image-store.s3.amazonaws.com/0/221759/1abf313c-1bac-38c3-fc58-126a01bda9df.png)

>
LINEプラットフォームを利用するには、アプリがチャネルにリンクされていなければなりません。チャネルを作成すると、固有のチャネルIDが識別用に発行されます。チャネルには、名前、説明文、およびアイコン画像が必要です。

## 実装
### 前提条件
- I2Cの設定     
水分センサなどのデバイスを利用する場合は、I2Cの設定が必要です。
I2Cの設定は以前書いた[Raspberry Pi の基本の「I2Cの設定」](https://qiita.com/Brutus/items/1683b5b3eac929047d12#i2c%E3%81%AE%E8%A8%AD%E5%AE%9A)を参照。


### ライブラリ準備
**※Pythonの環境変数に注意**
RaspbianのPython（デフォルト）は「/usr/bin/python」のシンボリックリンクで2.7のPythonになっているため、Python3を使用する場合はPython3を指定するなど考慮が必要です。

- Pythonの環境変数確認（2.7系）   
`$ which python`
- Pythonの環境変数確認（3系）   
`$ which python3`


#### ADS1015の導入
Adafruit社よりADS1015のライブラリがGitHubで公開されているので、クローンしてインストールします。

- ADS1015をクローン       
`$ git clone https://github.com/adafruit/Adafruit_Python_ADS1x15.git`
- ディレクトリを移動     
`$ cd Adafruit_Python_ADS1x15/`
- セットアップスクリプトを実行    
`$ sudo python3 setup.py install`     

※ADS1015は「smbus」ライブラリを使用するが、最新のRaspbianを使用する場合は最初から含まれているので導入不要

#### line-bot-sdk-pythonの導入
Messaging API SDKとして各種ライブララリをpipでインストールします。

- pip3でインストール    
`$ pip3 install line-bot-sdk`
- インストール確認    
`$ ls -l /home/pi/.local/lib/python3.5/site-packages/`

### プログラム（Python）

```python
#! /usr/bin/env python3
# _*_ coding: utf-8 _*_

# ADS1015の関数を読み込む
import time, signal, sys
import Adafruit_ADS1x15

# Messaging APIのパスを通す
sys.path.append('/home/pi/.local/lib/python3.5/site-packages/')

# Messaging APIのモジュールをインポート
from linebot import LineBotApi
from linebot.models import TextSendMessage
from linebot.exceptions import LineBotApiError

# channel access tokenを指定
line_bot_api = LineBotApi('<channel access token>')

# user IDとプッシュメッセージを指定
def message1():
    try:
      line_bot_api.push_message('<to>', TextSendMessage(text='お水ください'))
    except LineBotApiError as e:
    # error handle
      print("Error occurred")

# 計測の範囲を指定（1を指定した場合は-4.096Vから4.96Vまで計測可能）
GAIN = 1

abc = Adafruit_ADS1x15.ADS1015()

while True:
    volts = abc.read_adc(0, gain=GAIN)
    if volts >= 100:
       print( "State with moistured : " + str(volts) + "V" )
    elif volts < 100 and volts >= 1:
       print( "Condition with reduced moisture : " + str(volts) + "V" )
    else:
       print( "No moisture condition : " + str(volts) + "V")
       message1()
       break
    time.sleep(1)
```
※実際に運用するときは「time.sleep(N)」でNの値を調整したり、cronで定期的に動かすのがよさそうです。

## 実験
簡単植物通知システムの完成です:musical_note:
![写真 2018-03-07 0 33 18.jpg](https://qiita-image-store.s3.amazonaws.com/0/221759/31756eec-ebf4-5f2f-976f-0073b3d5fe9a.jpeg)


本プログラムの実行例になります。

- プログラムの実行   
`# ./moisture.py`    
- 植物の水分がある状態
![スクリーンショット 2018-03-07 00.14.42.png](https://qiita-image-store.s3.amazonaws.com/0/221759/7d8c1fc6-5967-642a-8b5a-7798e0e17343.png)

- 植物の水分がない状態（検証のため、わざと水分センサを抜く）
![スクリーンショット 2018-03-07 00.36.35.png](https://qiita-image-store.s3.amazonaws.com/0/221759/ccbe2db5-4030-620c-39f6-3158c96344c7.png)


- 水分センサで0を検知するとLINEにプッシュ通知が発信される
<img width="375" alt="写真 2018-03-07 0 15 14.png" src="https://qiita-image-store.s3.amazonaws.com/0/221759/f49492db-06de-0905-2f73-54e011eee354.png">

## 応答メッセージ
自動応答メッセージを使えば、植物とあいさつしたりちょっとした会話ができます。

Channel基本設定ページより自動応答メッセージの「設定はこちら」をクリックします。
![スクリーンショット 2018-03-07 00.48.02.png](https://qiita-image-store.s3.amazonaws.com/0/221759/e10ced7c-37fc-8fc2-513e-c9a20f50d917.png)

自動応答メッセージのページが表示されるので、こちらで設定ができます。
![スクリーンショット 2018-03-07 07.00.51.png](https://qiita-image-store.s3.amazonaws.com/0/221759/a7b63c9e-fa29-8e52-9d58-faf8db75f26c.png)

おはようと話しかけると、設定したメッセージを返してくれます。
<img width="375" alt="写真 2018-03-07 6 36 28.png" src="https://qiita-image-store.s3.amazonaws.com/0/221759/5c568a4c-3e24-7752-3172-e5a63d86c2a2.png">




## さいごに
Raspberry Pi + 水分センサ + Messaging API = 面白い

電子工作は面白いです。はんだ付けから電子回路、Python、API、各種ライブラリ等色々学習できます。また、自分で作って想定した通りに動いたときはいいですね。

本プログラムもまだまだ改良の余地があるので、改善して色々やってみたいと思います。


- 気になること    
Messaging APIのモジュールインポートが少し長い
→timeコマンドで計測すると、プログラム実行時の読み込みで2秒弱ぐらいかかっています。単純にMessaging API使うだけだったら、サンプルにあるようなcurlコマンドでスクリプトにした方が早かったです。あとで調べてみよう。


## 参考
- [公式のプラン・料金](https://at.line.me/jp/plan)
- [ボットを作成する](https://developers.line.me/ja/docs/messaging-api/building-bot/)
- [APIリファレンス](https://developers.line.me/ja/docs/messaging-api/reference/#send-push-message)
- [Grove - Moisture Sensor](http://wiki.seeed.cc/Grove-Moisture_Sensor/)
- [ADS1015 / ADS1115](https://learn.adafruit.com/raspberry-pi-analog-to-digital-converters/ads1015-slash-ads1115)