Watson IoT Platform を 使って 猫ちゃんへの投薬をデータベースに記録するよ

### 1. はじめに

ESP32に繋げたボタン(タクトスイッチ)を押したら IBM Watson IoT Platform を経由して Db２ on Cloud にデータを蓄積するという仕組みを作ってみました。その時の設定の手順になります。

なんでこんなことをしているのかと言いますと、毎日猫ちゃんにお薬を飲ませているのですが、飲ませた時にボタンを押して、飲ませたよという記録が取れるのは結構便利なんじゃないかと思ったからです。さらには、ボタンをたくさんつけた別バージョンを用意して、ご飯とおやつの管理にも使えそうです。夢は膨らむ。


毎日お薬飲んで偉いね
![1CB83979-DD77-4B8D-B40A-71E0A15B64F0.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/803289fe-96d3-2753-fd90-28ec35a84aee.jpeg)


#### 1-1. 使ったもの

デバイス編

- ESP32-DevKitC（Mongoose OS）
- ミニブレッドボード
- タクトスイッチ
- 抵抗


クラウドサービス編

- IBM Cloud
    - Watson IoT Platform ライト版（無償枠利用）
    - Node-RED ライト版（無償枠利用）
    - Db２ on cloud  ライト版（無償枠利用）



#### 1-2. 全体の流れのイメージ
<img width="769" alt="WatsonIot_MQTT.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/0abbfa86-1fea-8c8f-87e9-c508ea214738.png">



### 2. 事前準備
- 事前に [IBM Cloud](https://cloud.ibm.com/login) の アカウントを作成しておきます。

- [Db2 on Cloud を作成しておきます。](https://qiita.com/Asuka_Saito/items/c40a17f02a588953f576)

- [Node-RED を作成しておきます](https://qiita.com/Asuka_Saito/items/e2c21e43ce583f3dc21a)


### 3. Watson IoT Platform の開始

3-1. IBM Cloudにログインするとダッシュボードのページが表示されると思います。このダッシュボードのページの上の方にカタログ(使用できるサービス)の検索ボックスがあるので「Watson IoT」と入力して「Internet of Things Platform」を選択します。
<img width="797" alt="WatsonIot_dev_1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/65497280-10ae-77e7-fdbc-3ccb13170917.png">

3-2.サービス名を記載し、デプロイするロケーションを選択します。
<img width="1573" alt="WatsonIot_dev_2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/9a8ad535-7292-9261-542c-2e67237c2045.png">

3-3.下の方にスクロールします。価格プランで「ライト」を選択して「作成」をクリックします。
<img width="1569" alt="WatsonIot_dev_3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/5d4eaafd-7076-5881-4683-cf17018292dd.png">

3-4.以下のページが表示されたら、「起動」をクリックします。
<img width="1573" alt="WatsonIot_dev_4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/bc97cb93-2e99-688d-8b9e-ed931ec84276.png">

3-5.左側のメニューから「アプリ」を選びます。アプリのページが表示されたら、「APIキーの生成」をクリックします。
<img width="1569" alt="WatsonIot_dev_5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/5e0c1522-54b0-8a7b-995f-0210033540c3.png">

3-6.APIキーの生成画面が表示されます。有効期限を設定したい場合は、オンにします。設定しない場合は、デフォルトのまま「次へ」をクリックします。
<img width="1495" alt="WatsonIot_dev_6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/69e60afc-843f-0a94-2d27-336e7a368254.png">

3-7.役割で「標準アプリケーション」を選択し「キーの生成」をクリックします。
<img width="1499" alt="WatsonIot_dev_7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/08fe4f2f-8fae-f44f-1a10-60f59101c626.png">

3-8.APIキーと認証トークンをメモしておきます。「閉じる」をクリックして終了します。
<img width="1500" alt="WatsonIot_dev_8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/497abe9b-3b7d-4493-872a-a436670385d9.png">



### 4. デバイスの準備


デバイスの準備は主に以下が必要となります。

- ESP32へのMongooseの書き込みと設定
- タクトスイッチの回路の作成


#### 4-1. ESP32へのMongoose OSの書き込み

まずはPCとESP32をUSBケーブルで繋ぎます。
ESP32へのMongoose OSの書き込みは、mongoose-os.comからチュートリアルが出ておりまして、こちらをそのまま実施すればOKです。

- https://www.youtube.com/watch?v=Uzyere6_WlE
- https://mongoose-os.com/docs/mongoose-os/cloud/watson.md


以下は私がMacを使用して設定を行った際の手順になります。
##### 4-1-1. OS書き込みツール(mosツール)のダウンロードとインストール

brew Utility を インストールするため、ターミナルを起動して以下のコマンドを実行します。

`brew tap cesanta/mos`

続けて、mosツールをインストールします。

`brew install mos`


##### 4-1-2. 続けてターミナル上で以下のコマンドを実行し、mosツールを起動します。

`mos`



以下のツールが立ち上がります。①左側がローカルのPCのログウインドウです。②右側がESP32のログウインドウです。③下にあるテキスト入力エリアがコマンドラインを実行するところです。
![mos_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/591a7957-4522-168a-b1b0-cfe11425b50b.png)


##### 4-1-3. USBシリアルドライバーのインストール
私のセットアップでは出ませんでいたが、ESP３２側のログウインドウで、シリアルポートが利用できないというエラーメッセージ(No serial ports unabairable.)が表示されたら、英語ですが[こちら](https://mongoose-os.com/docs/mongoose-os/quickstart/setup.md#3-usb-to-serial-drivers)のページをご確認いただき、ドライバーをインストールしてください。

##### 4-1-4. Githubのリポジトリのクローン

左上の設定箇所にて、①「/dev/cu.SLAB_USBtoUART」②「ESP32」をそれぞれ設定しておきます。

mosツールから、以下のコマンドを実行して、ローカルのPCの所定のディレクトリにGithubのリポジトリをクローンします。

`mos clone https://github.com/mongoose-os-apps/demo-js app1`


<img width="1197" alt="WatsonIot_dev_9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/09dfae5d-3f4f-e22d-d179-e6b84bca4593.png">

実行後、app1に移動(change directory)しているのを確認します。
<img width="1195" alt="WatsonIot_dev_10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/2d643454-d9c4-1fac-f4a2-131c42a623d2.png">

##### 4-1-5. ファームウェアのビルド
mosツールから以下のコマンドを実行します。/app1/buildの下に、fw.zipがダウンロードされます。

`mos build`

<img width="1200" alt="WatsonIot_dev_11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/f2fb0b8e-1dc2-700e-becd-bdcd4767a40f.png">

##### 4-1-6. ファームウェアの書き込み
①「/dev/cu.SLAB_USBtoUART」②「ESP32」が選択されていることを確認してmosツールから以下のコマンドを実行します。

`mos flash`

<img width="1197" alt="WatsonIot_dev_12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/fcba9e6f-8139-acb6-e4e0-aaa847877b3d.png">


##### 4-1-7. Wifiの設定

mosツールから以下のコマンドを実行してwifiを設定します。

`mos wifi WIFI_NETWORK_NAME WIFI_PASSWORD`
<img width="1194" alt="WatsonIot_dev_13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/906cf24c-0290-d520-290f-8c0c569a16a2.png">

##### 4-1-8. IBM Watson IoT Platformへの登録の設定

mosツールから以下のコマンドを実行します。

`mos watson-iot-setup`
<img width="1197" alt="WatsonIot_dev_14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/3fd82985-52bc-d0a8-1e50-5ef8e3a06e2d.png">


##### 4-1-9. Mongoose OS RPCのサポートの無効化設定
以下のコマンドを実行して、Mongoose OS RPCのサポートを無効化します。
`mos config-set rpc.mqtt.enable=false`
<img width="1196" alt="WatsonIot_dev_15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/4fb96d0b-8e89-6720-4b12-ea0827c8df56.png">


##### 4-1-10. init.jsの編集
/app1/fs/init.js を 直接開いて、中身を以下で書き換え、保存します。

```javascript

// Button
load('api_gpio.js');
load('api_mqtt.js');
 
let pin = 14; //PINの番号
let topic = 'iot-2/evt/mos/fmt/json'; //Watson IoT Platform と連携する場合は、この値にする必要あり
let qos = 0;
 
GPIO.set_mode(pin, GPIO.MODE_INPUT);
GPIO.set_button_handler(pin, GPIO.PULL_UP, GPIO.INT_EDGE_NEG, 20, function(x) {
  let message = JSON.stringify({
    "number": 1 //送信するデータ
  });
  let ok = MQTT.pub(topic, message, qos);
  print('Published:', ok ? 'yes' : 'no', ', topic:', topic, ', message:', message);
}, true);


```

##### 4-1-11. init.jsのESP32側への転送

以下のコマンドを実行し、 ローカルPCのinit.jsをESP32側に転送します。

`mos put /Users/asukasaito/mos/app1/fs/init.js`
*色々試してみましたが、フルパスで書いた方が失敗しにくい印象です。

<img width="1198" alt="WatsonIot_dev_16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/cef47756-969b-997f-e70a-2fd6ec83b68b.png">


##### 4-1-12. IBM Cloud のアカウントのセットアップ

以下のコマンドを実行し、 IBM Cloud のアカウントのセットアップを実施します。APIキーとトークンは 3-8でメモしておいたものを使用します。

`mos watson-iot-setup --watson-api-key a-bcdefgh-qwertyio --watson-api-auth-token "tokengoeshere"`

<img width="1200" alt="WatsonIot_dev_17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/e7d7099c-37cc-150d-4ebc-fd56e47d8be0.png">


#### 4-2. タクトスイッチの接続（回路の作成）

ここは完全に素人なので、みなさまはご自身でお調べになっていただき、タクトスイッチを取り付けていただきたいのですが(爆)、私のESP32ではブレッドボードミニを使用して、タクトスイッチをIO用のPINとGNDに繋がるように配置し、プルダウン（スイッチ押下）方式で通電するように、抵抗をGND側につけております。
私の環境では、PIN14に繋げています。そのため、4-1-10で編集したinit.jsでは「let pin = 14」と設定しています。
![ESP32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/639c6983-2150-7b6f-9f7d-02cd87c65f59.png)


回路を変更したりするときは電源を落として(ケーブルを抜いて)おく方が安全です。（鉄則？）




### 5. 接続テスト

5-1. はじめにデバイス側のテストを行います。PCとESP32をUSBケーブルで繋いで、mosツールを起動します。

5-2. タクトスイッチを押して、mosツールに以下のログが表示されるか確認します。
`Published: yes , topic: iot-2/evt/mos/fmt/json , message: {"number":1} `
<img width="1197" alt="WatsonIot_dev_18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/4b902278-6559-a678-4a68-98030d370804.png">

5-3. Watson IoT Platform に戻り、 「デバイスの参照」ページを表示します。デバイスが登録されて状況が「接続済み」になっていることを確認します。
<img width="1571" alt="WatsonIot_dev_19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/0b84515e-fe80-d448-5dc1-561f5e2058b4.png">


### 6. Node-REDの準備
Node-REDを使用して、MQTTのメッセージをサブスクライブします。

6-1.こちらの記事をご覧いただき、Node-REDの環境をセットアップします。（0-1を実施します。）
[IBM Cloud の Node-REDを使ってセンサーデータを Db2 on Cloud にいれるよ](https://qiita.com/Asuka_Saito/items/e2c21e43ce583f3dc21a)

6-2.左側のメニューの入力から「ibmiot」を選択し、パレットに追加します。
<img width="678" alt="WatsonIot_dev_20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/7842ea60-0372-4ef4-3eb2-4081fbc03007.png">

6-3.追加したノードをダブルクリックします。設定画面が表示されます。Authenticationの設定箇所で①「API Key」を選択し、②「API Key」の箇所で「新規にibmiotを追加」を選択し、③編集アイコンをクリックします。
<img width="523" alt="WatsonIot_dev_21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/7e47466e-33b5-7760-ddff-d253dcbdab83.png">
*すでに、接続する環境のAPI Keyが設定されている場合は、②で設定名を選択します。

6-4. Name, API Key, API Token を設定し、「更新」をクリックします。
<img width="515" alt="WatsonIot_dev_22.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/2be7b824-0c76-daf0-5357-6382f089f361.png">


6-5.前の画面に戻ります。①「Input Type」 で 「Device Event」を選択し、②「Qos」 で 「0」を選択します。「完了」をクリックします。
<img width="523" alt="WatsonIot_dev_23.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/db7c7d82-3083-3262-7ec3-1a79ffa15a42.png">

6-6.左側の出力から「Debug」を選択し、パレットに追加します。「ibmiot」と「Debug」を繋ぎます。
<img width="734" alt="WatsonIot_dev_24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/edaa7ac3-3109-08a1-a437-67988dfbddf4.png">

6-7. デプロイをクリックします。その後、デバッグメッセージのパネルを開いておきます。
<img width="1176" alt="WatsonIot_dev_25.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/c9afd204-629f-527a-7b77-7df97d7f0b76.png">

6-8.タクトスイッチを押して、デバッグメッセージのパネルにデバイスのイベントのメッセージが表示されればOKです。
<img width="1178" alt="WatsonIot_dev_26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/2b7d8dc6-b77f-76d8-3b6e-aed8f8cef5d2.png">

6-9.メッセージを加工します。
1と送られてきたら「お薬」に変換します。あと、現在時刻も追加したいと思います。
左側の機能から「function」を選択し、パレットに追加します。「ibmiot」のノードと繋ぎます。
<img width="760" alt="WatsonIot_dev_27.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/eeb9bdcd-64e8-4bf1-f1d2-93ca96359a0b.png">


6-10.functionのノードをダブルクリックして設定画面を開き、名前を付け、以下のスクリプトを貼り付けます。「完了」をクリックします。


```javascript
var getCurrentTime = function () {
    var date = new Date();
    date.setHours(date.getHours() + 9);
    var d = date.getFullYear() + '-';
    d += ('0' + (date.getMonth() + 1)).slice(-2) + '-';
    d += ('0' + date.getDate()).slice(-2) + 'T';
    d += ('0' + date.getHours()).slice(-2) + ':';
    d += ('0' + date.getMinutes()).slice(-2) + ':';
    d += ('0' + date.getSeconds()).slice(-2) + 'Z';
    return d;
};

var number = msg.payload.number;
var text = "";
if (number ==1 ){
    text = "お薬";
}else{
    text ="error";
}

msg.payload =  {
    "TIMESTAMP": getCurrentTime(),
    "TEXT":text
};

return msg;

```

<img width="516" alt="WatsonIot_dev_28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/b8905f17-e0c5-2c7e-1771-c7589378475a.png">

6-11.debugノードとfunctionノードを繋ぎなおしてデプロイします。その後、タクトスイッチを押して、変換したメッセージがデバッグメッセージに表示されるか確認します。
<img width="1177" alt="WatsonIot_dev_29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/3dffa53a-f18d-b319-d6a9-c664253e4a52.png">


### 7. データ挿入の準備
7-1.事前に作成しておいた [Db2 on Cloud](https://qiita.com/Asuka_Saito/items/c40a17f02a588953f576) へログインし、左側のメニューをクリックして「RUN SQL」をクリックします。

7-2. 以下のDDLを実行し表を作成します。

```terminal
CREATE TABLE MEDICINE_FOR_CAT
(
TIMESTAMP VARCHAR(20),
TEXT VARCHAR(20)
)
```

7−3.Node-REDに戻り、左側のストレージから、一番下の dashDB を選択して、パネルに追加します。functionのノードと接続します。
<img width="864" alt="WatsonIot_dev_30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/2f8d24a1-a241-ea35-5269-35d348973e83.png">

7-4. dashDBのノードをダブルクリックして設定画面を開きます。Serviceで①「External dashDB or DB2 Instance」を選択し、②「Server」の箇所で「新規にdashDBを追加」を選択し、③編集アイコンをクリックします。
<img width="515" alt="WatsonIot_dev_31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/34a47e39-69de-bada-8364-4814b6e3f74d.png">
*すでに、接続する環境が設定されている場合は、②で設定名を選択します。

7-5. Hostname、Database、Username、Password、Portを入力し「更新」をクリックします。
<img width="514" alt="WatsonIot_dev_32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/b4b69df2-423d-5cd4-e329-d9abba00eb00.png">

7-6.前の画面に戻ります。Tableに先ほど作成した表名を入力し「完了」をクリックします。その後デプロイをクリックします。
<img width="513" alt="WatsonIot_dev_33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/5592ac16-e585-5056-a3b4-c4cfc4f748c5.png">

7-7.タクトスイッチを押して、データベースにデータが入るか確認します。
Db2 on Cloudへログインし、左側のメニューをクリックして「RUN SQL」をクリックし以下を実行します。
`SELECT * FROM MEDICINE_FOR_CAT`

<img width="1341" alt="WatsonIot_dev_34.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/435996/6b01ce42-fef6-3799-0f7b-451db04f181a.png">


データが入ってました！

以上、Watson IoT Platform を 使って 猫ちゃんへの投薬をデータベースに記録するよ、でした。
はー今回記事作成大変だった〜

:smiley_cat: :smiley_cat: