TWE-Lite-2525Aで開閉センサ(Twitter連携) を作ってみた

#TWE-Lite-2525Aで開閉センサもどきを作ってみた

　夏季休暇を利用して、電子工作にチャレンジして見ました。Qiita初投稿です。

#今回のゴール
　小型の加速度付きIOTセンサ(TWE-LITE-2525A)を利用して振動(加速度)を検知、TwitterのAPIにPOSTする。

　<img width="456" alt="DSC_0448.png" src="https://qiita-image-store.s3.amazonaws.com/0/93661/71b00b2e-836f-9976-1204-afb411d673d4.png">

###　今回購入したもの
　　秋月電子からWebで購入。2日ほどで到着しました。
　　- モノワイヤレス株式会社：
　　　　1.TWE-LITE-2525A（トワイライトニコニコ）
　　　　2.MONOSTICK（モノスティック）
　　- ゴールデンパワー製
　　　　3.リチウム電池 CR2032
### 　その他開発環境：
　　- Windows10(64bit)
　　- Python3系




#1.TWE-LITE-2525Aの準備
　購入時のままだと、トワイライト2525から送信されてくるデータが扱いづらいので、
　MONOSTICK、TWE-LITE-2525Aの設定を書き換えます。

　書き換えるには、「OTA」と言われる機能を使うんですが
　「USB側(受信機：モノスティック側)へファームを書き込み、USB側からセンサ側へ無線で上書き」をする仕組みです。
　ただし、USB側はその後受信機として利用するのでまた受信機用としてのファームを上書く必要があります。
　＃Over The Airの略らしい。

　公式の動画があるので以下をみると概要がつかみやすいです。
　https://www.youtube.com/watch?v=uq_pkrvypBA

　流れがわかったけど、実際どうやって何を書き換えるんだ、、、ってことです。
　公式HPの情報が散らかっており、動かすまでに少しハマりました。

###　1-1.上書き用データの準備
　「Samp_Monitor アプリケーション」を以下からDLします。
　https://mono-wireless.com/jp/products/TWE-Lite-2525A/firmware_update.html
>　1.Samp_Monitor_EndDevice_Input_JN5164_CNFMST_1_6_1.bin
>　2.Samp_Monitor_EndDevice_Input_JN5164_LITE2525A_1_6_1.bin
>　3.Samp_Monitor_Parent_JN5164_1_6_1.bin

　DLしてきたZIPファイルには上記3つが入っていますが、
　センサ側にインストールするbinは1を利用、　USB側にインストールするbinは3を利用します。
　※2は今回は不要です

###　1-2.USBへのファーム書き込み
　「Windows 用 TWE-LITE プログラマ」を以下からDL/インストールします。
　http://mono-wireless.com/jp/tech/misc/LiteProg/

　本アプリケーションを利用して、各種ファームウェアをUSB側モノスティックに書き込みます。
<img width="456" alt="3 monopg.png" src="https://qiita-image-store.s3.amazonaws.com/0/93661/80b51147-7d93-99f2-b057-c3e77fbb0e55.png">


　別ウインドウなどでMONOSTICKが認識されていると、本アプリケーション側で認識されないのでご注意を。
　そのほか、認識されない場合はUSBを抜き差しするとよいかも。


###　1-3.センサー側へのファームウェア書き込み
　上記、TWE-LITE プログラマを利用して、センサ側に書き込むファームウェア　　　
　(1.Samp_Monitor_EndDevice_Input_JN5164_CNFMST_1_6_1.bin)をUSBに書き込みます。

　動画の要領で、任意の設定に変更します。(「S」で設定を保存を忘れないように）
　TeraTermでのシリアル接続やボーレートの設定等細かいものは別途公式を参考。

　今回の設定は以下画像を参考
 <img width="494" alt="sensor.png" src="https://qiita-image-store.s3.amazonaws.com/0/93661/96876bdf-7640-0d11-0a2f-0458f195962c.png">

　設定完了後、センサをUSBに近づけたままリチウム電源を入れて、
　センサ側ファームの書き換えをしてください。

###　1-4.USB側へのファームの書き込み
　TWE-LITE プログラマを利用して、USB側に書き込むファームウェア
　(3.Samp_Monitor_Parent_JN5164_1_6_1.bin)をUSBに書き込みます。

　動画の要領で、任意の設定に変更します。(「S」で設定を保存を忘れないように）

　今回の設定は以下画像を参考
 <img width="494" alt="usb.png" src="https://qiita-image-store.s3.amazonaws.com/0/93661/b779ac22-5963-4cee-7f74-72f1bdcaba7e.png">

　USB側はこのままで設定が完了です。

###　1-5.動作確認
 TeraTermから確認をすると、以下のようにkey=valueの状態で各種値を取得できます。

 センサーの反応がない場合は、「ts」タグのみが出力されます。
　x軸、y軸、z軸が取れてますね。(今回はそこまで見ません)
 <img width="494" alt="kyacchi.png" src="https://qiita-image-store.s3.amazonaws.com/0/93661/57b964da-5f2f-4235-e025-c8e775e86dac.png">


# 2.Python側プログラムの作成
　初めてPython書いてみました。
　Pythonのインストール、TwitterAPI作成については別途参考願います。

　PythonでのTwitter(OAuth)連携はrequests-oauthlibという Python 用の OAuth 認証ライブラリを利用。
　こんな感じでライブラリをインストール。

> pip install requests requests_oauthlib

　モノワイヤレス社のHPにあるサンプルを参考にコードを作成。
　全体のソースコードはこんな感じ。

```py3:DetectionTweet.py
import serial
import requests
from requests_oauthlib import OAuth1Session
from datetime import datetime

CK = 'Write your Consumer Key'
CS = 'Write your Consumer Secret'
AT = 'Write your Access Token'
AS = 'Write your Accesss Token Secert'

# COM3を開く
s = serial.Serial('COM3', 115200)

# ツイート投稿用のURL
url = "https://api.twitter.com/1.1/statuses/update.json"

# 無限ループ
while 1:
    data = s.readline()
    
    # 先頭の「:」を取り除く
    data = data[2:]
    spilitdatum = data.decode('utf-8').split(":")
    
    dict = {}
    
    # key,value型にしてディクショナリに保存
    for spilitdata in spilitdatum:
        
        s_key = spilitdata.split("=")[0]
        s_val = spilitdata.split("=")[1]
        
        dict[s_key] = s_val
    
    # センサーから検知がない時は「ts」のkeyしかとれないので、
    # ここでは適当なkeyとして[id]で判断
    if ("id" in dict):
        
        # ツイート本文
        # Twitterは同一本文だとStatus is a duplicateで403Statusになるので時刻をつける。
        params = {"status": "Vibrate Detection! " + "\n" + datetime.now().strftime('%X')}
        
        # OAuth認証で POST method で投稿
        twitter = OAuth1Session(CK, CS, AT, AS)
        req = twitter.post(url, params = params)

        # レスポンスを確認
        if req.status_code == 200:
            print ("OK: %s" % req)
        else:
            print ("Error: %s" % req.content)

s.close()
```

# 3.TWE-Lite-25252AとTwitterの連携確認。

　簡易ですが、ドアにピタリ。
<img width="456" alt="DSC_0450.png" src="https://qiita-image-store.s3.amazonaws.com/0/93661/af47af40-b1e7-42c0-5fdd-bd3f6a7459ab.png">


　ドアの開閉で見事Tweetしてくれました。
<img width="494" alt="cmd.png" src="https://qiita-image-store.s3.amazonaws.com/0/93661/d53cd073-2109-26c6-f1a0-86a0f33113e4.png">

<img width="494" alt="Detect.png" src="https://qiita-image-store.s3.amazonaws.com/0/93661/b9f3aa2e-f391-91ed-df51-dcd6822cfc89.png">

　このままだと検知が多すぎる(一回のドアの開け閉めで2,3通の通知が来る)ので、
　無線側の通知タイミング(デフォルト0.5秒)をへらしたり、Python側、サーバ側での調整が必要そう。
　Twitterのリソースも使いすぎるしね；；

　あとは、AWSIoTとかMQTTとか組み合わせるとIOTサービスのできあがり。
　子供の夏休みの宿題に電子工作はいかがでしょう？

　ということで、初めてQiita書いたけど疲れた。