Groovy-IoT + kikori (1. PCベースでのセンサ・ハンドリング)

#はじめに
　本稿ではGroovy-IoT + kikoriでのセンサの取扱をまずはPCで行うことにします。
![PC_Base_dev_env.png](https://qiita-image-store.s3.amazonaws.com/0/156757/2a3cc8ae-059d-6d1f-60d1-8dd598223aeb.png)

#ゴール
　PCに接続した環境センサ(温度、湿度、気圧)-BME280から取得した環境情報を手持ちのスマホで確認できるシステムを構築します。

#開発環境の準備
　センサの取扱にあたり開発環境の準備をします。

##ハード
　1. PC or Mac
　2. [Groovy-IoT](http://www.omiya-giken.com/?page_id=2262)
　3. センサ: [Grove-BME280](https://www.switch-science.com/catalog/3374/) or [BME280センサモジュールをGrove化したもの](https://www.amazon.co.jp/dp/B01GQ3T1A4/ref=asc_df_B01GQ3T1A42559068/?tag=jpgo-22&creative=9315&creativeASIN=B01GQ3T1A4&linkCode=df0&hvadid=280325438112&hvpos=1o4&hvnetw=g&hvrand=3945782340807332175&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=1009343&hvtargid=pla-492193599000)
　4. アクチュエータ: [Grove-LED](https://www.switch-science.com/catalog/1254/)
 
##ソフト
　0. JDK10+
　1. [kikori](https://gitlab.com/myst3m/kikori)
　2. [enebular-editor](https://docs.enebular.com/en/enebulareditor/)

#こんな感じ
　開発とテストのスクリーンショットになります。
　ここでは(株)ウフルで開発した[enebular-editor](https://docs.enebular.com/en/enebulareditor/)を使って開発します。

![screenShot_ee_whole_en.png](https://qiita-image-store.s3.amazonaws.com/0/156757/13dafb87-0731-11b7-be1a-27bb41fcbc83.png)

#開発環境の設定
##ハード(Groovy-IoTやセンサとアクチュエータ)の接続
写真の通りに接続します。
Groovy-IoTのGroveコネクタを向かって右に見て、上から
- I2C(BME280)
- UART(空ける)
- GPIO1(LED)
- GPIO2(空ける)
となります。
![IMG_1402.jpg](https://qiita-image-store.s3.amazonaws.com/0/156757/78538801-3232-cde5-febe-77a55cd7bfed.jpeg)


##ソフトのインストールと起動
　筆者のメインのPCはMacになりますので、ここではMacを使います。Windowsをお使いの方は適宜、自分の環境に置き換えてください。
###JDKのダウンロードとインストール
　kikoriはclojureで記述されています。clojureはJVM由来の言語ですのでJDKがベースとなります。JDKのダウンロードとインストールは各自で予め行ってください。
###kikoriのダウンロード
　kikoriはOSSなのでソースからビルドすることも出来ますが、ここではすばやく使うためにtar-ball(バイナリ)をダウンロードして解凍してそのまま使うことにします。ターゲットのファイルは以下で確認してください。
[https://gitlab.com/myst3m/kikori](https://gitlab.com/myst3m/kikori)

適当なディレクトリに移動した後にコマンドラインで、
[`$ curl -OL 'https://theorems.co/kikori/kikori-system-1.4.3-SNAPSHOT.tar.gz'`](https://theorems.co/kikori/kikori-system-1.4.3-SNAPSHOT.tar.gz)
を実行してダウンロードします。

###kikoriのインストール
ダウンロードが完了したら、
`$ tar xvfz ./kikori-system-1.4.3-SNAPSHOT.tar.gz`
を実行して解凍します。

###kikoriの設定
kikoriの設定は、解凍したディレクトリ内の`system.clj`で行います。
- シリアルポートの確認
　Groovy-IoTはシリアルポート機能があります。シリアルポートは動的に設定されますので、そのデバイスファイルを確認して`system.clj`に記述する必要があります。コマンドプロンプトから以下を実行します。
`[ooo@mbpro13 kikori-system-1.4.3-SNAPSHOT]$ ls /dev/tty.*
/dev/tty.Bluetooth-Incoming-Port	/dev/tty.usbmodem14201`
**tty.usbmodem14201**
で`system.clj`の当該部分を置き換えます。
...
`    ;; (config :UART {:path "/dev/ttyACM0" :baud-rate 9600}) ;; For Linux/RasPi
    (config :UART {:path "/dev/tty.usbmodem14201" :baud-rate 9600}) ;; For Macintosh Mojave+, Confirm wiht "ls /dev/tty.*" after plugin
    ;; (config :UART {:path "COMx" :baud-rate 9600}) ;; For Windows
    ;; Will be called read function  by :module`
...

###kikoriの起動と終了
- kikoriの起動

kikoriの起動は以下のコマンドでおこないます。
`$ java -cp modules:kikori-1.4.3-SNAPSHOT.jar kikori.shell system.clj`

起動後、以下のメッセージが現れます。
============ Device Configuration ============

{:system {:PCB "1.0.0", :power :5.0},
 :GP1 nil,
 :GP3 nil,
 :sensors
 {GP0
  {:name "GP0",
   :bus :GP0,
   :id "351656c3-097f-47cf-a900-ef631dfb17a8",
   :module :GPIO,
...
:uart {:path "/dev/tty.usbmodem14201", :baud-rate 9600},
 :GP2 :ADC2,
 :GP0 :GPIO,
 :product-id 0xdd,
 :vendor-id 0xd8}

==============================================

Configure the device with above ? (Yes [Y] or No [N])

ここで、`y`を入力して、処理を進めます。以下に続きます。

Booted Web server on  0.0.0.0 : 3000

Welcome to Kikori shell !

\- Run (quit) when you want to shutdown kikori.

groovy-iot>

以上でkikoriは起動しました。


- kikoriの終了<br>
kikoriを終了するためには、kikoriのシェル（コマンドプロンプト)から`(quit)`コマンドを入力します。<br>
groovy-iot> `(quit)`


#疎通確認
Groovy-IoTにつないだセンサととkikoriが正常に動作しているかを確認します。WebSensorServerなので、サーバの疎通確認と同様の手法で行います。kikoriの起動後、別のターミナルを開きます。
`curl  "http://localhost:3000/sensor?ids=BME1"`
{"BME1":{"pressure":1024.925222406158,"temperature":22.29934563106508,"humidity":32.24111540420265}}

***注意：
接続しているBME280センサのI2Cアドレスにより、BME0にするかBME1にします。Grove純正BME280センサの場合はBME0にします。***

#実際の開発
開発にはenebular-editorを使います。
フローは大きく分けて、`環境センサの値をスマホに表示`と`LEDの点滅`になります。Dashboard-Nodeはダウンロードしたばかりのenebular-editorのパレットには用意されていないので、Dashboard-Nodeの準備を行ってください。

##環境センサの値をスマホに表示
- 全体の構成<br>
 - enebular-editorでの全体フローは以下のようになります。
 ![WholeFlow.png](https://qiita-image-store.s3.amazonaws.com/0/156757/5eb45be5-5824-a327-6f77-7de3d19f40c8.png)

 - センサへのアクセスはサーバへのリクエストになりますから、HTTP-RequestノードにURIを記述することによりおこないます。 
 ![InsideHttpReq.png](https://qiita-image-store.s3.amazonaws.com/0/156757/1af5b26c-2d8e-b44e-f9f1-e73fb7dc3b94.png)

 - センサデータはJSONに変換した後にDASH-Boardノードに接続します。
 ![SensorDataToDashboard.png](https://qiita-image-store.s3.amazonaws.com/0/156757/c3475a95-f578-06e0-8388-08a9384bef0d.png)

##LEDの点滅
次にLEDの点滅についてフローを作成します。LEDの点滅は`Lチカ`と呼ばれ、最も基本的なアクチェータの制御になります。ここではInjection-Nodeで点滅周期を決定して後段のLEDの制御につなげます。<br>

- Injection-Nodeの設定
![LED_injection.png](https://qiita-image-store.s3.amazonaws.com/0/156757/7f6e7364-bde3-b3ce-0bf1-e9eeb794dcf5.png)

- 点滅の切り替え
Function-Nodeでトグル動作を作成して、LEDの点滅を行います、
![LED_toggle.png](https://qiita-image-store.s3.amazonaws.com/0/156757/453cbacc-91fa-3ffe-3749-c75f89cfa7ba.png)

- HTTP-Request ノードを使ってのLEDの制御
ここではLED-Onの部分のみですが、LED-Offも作成してください。
![LED_On.png](https://qiita-image-store.s3.amazonaws.com/0/156757/89ce30db-3505-3187-f773-6330709cdeec.png)


##上記のフロー
```JSON
[{"id":"e6752dc6.50d5d","type":"inject","z":"763d791f.75a928","name":"","topic":"","payload":"","payloadType":"date","repeat":"4","crontab":"","once":false,"onceDelay":0.1,"x":110,"y":80,"wires":[["f509bb3f.836298"]]},{"id":"f509bb3f.836298","type":"http request","z":"763d791f.75a928","name":"","method":"GET","ret":"txt","url":"http://localhost:3000/sensor?ids=BME1","tls":"","x":310,"y":80,"wires":[["fb1fb321.ebd56","58c840c4.dcfa7"]]}]
```

#動作確認
フローの作成が終わったら、右上の`Save`を押し、フローを実行させます。
![DeploySaveCloseUp.png](https://qiita-image-store.s3.amazonaws.com/0/156757/ad9bac94-d589-5a99-409d-03930f8d9373.png)


同一LANで接続されているスマホであれば、それを使っての確認もできます。MacではiOSのシミュレータを使っての確認も可能です。
![MobileSimResult.png](https://qiita-image-store.s3.amazonaws.com/0/156757/bf3a5e7f-88c2-c07f-8e54-757cfb061713.png)

面倒くさい方はウェブブラウザ　[http://localhost:1888/ui/#/0](http://localhost:1888/ui/#/0)　からもアクセス可能です。

#まとめ
　Groovy-IoTによるGrove Systemのセンサ活用、kikoriによるセンサ／アクチェータへの統一的なアクセス方法をNode-RED由来のenebular-editorでのフロー開発は非常にわかりやすく高速に開発が可能です。

#次回
　kikoriの機能を掘り下げていきます。