Raspberry Pi + CANDY Pi Lite を使って、conect+ と連携してみた! | conect+ - Part 3

Raspberry Pi + CANDY Pi Lite を使って、conect+ と連携してみた!

Raspberry Pi + CANDY Pi Lite を使って、conect+ と連携してみた!

 第一回ではラズパイのセットアップから、CANDY Pi Lite の接続までを行いました。

今回は CANDY RED、CANDY EGG でのフローの作成についてお伝えします。
CANDY EGG の利用には利用申込が必要となります。

CANDY RED(ラズパイ側)


画面右上の メニュー → Import → Clipboard を選択し、下記のフローをインポートします。

 

 

 

 

 

 

 

 

[
    {
        "id": "869a03fe.13a2b",
        "type": "debug",
        "z": "4f6dc550.741b7c",
        "name": "デバッグ",
        "active": true,
        "console": "false",
        "complete": "payload",
        "x": 510,
        "y": 206,
        "wires": []
    },
    {
        "id": "830d9c62.3011a",
        "type": "inject",
        "z": "4f6dc550.741b7c",
        "name": "10秒毎に実行",
        "topic": "713d0002503e4c75ba943148f18d941e",
        "payload": "",
        "payloadType": "date",
        "repeat": "10",
        "crontab": "",
        "once": true,
        "x": 109,
        "y": 49,
        "wires": [
            [
                "e7300291.31ae2"
            ]
        ]
    },
    {
        "id": "440df38e.db025c",
        "type": "function",
        "z": "4f6dc550.741b7c",
        "name": "摂氏温度を復元",
        "func": "var buf = msg.payload.characteristics['713d0002503e4c75ba943148f18d941e'];\nvar temp = buf[0] + buf[1] / 100;\n\nmsg.payload = {\n sensing_time: Date.now(),\n device_id: \"ADT7410_01\",\n item: \"temp\",\n value: temp\n};\n\nreturn msg;",
        "outputs": 1,
        "noerr": 0,
        "x": 296,
        "y": 206,
        "wires": [
            [
                "869a03fe.13a2b",
                "95848b68.866278"
            ]
        ]
    },
    {
        "id": "95848b68.866278",
        "type": "CANDY EGG websocket out",
        "z": "4f6dc550.741b7c",
        "name": "CANDY EGG に送信",
        "account": "",
        "path": "/temperature",
        "wholemsg": "false",
        "x": 402,
        "y": 277,
        "wires": []
    },
    {
        "id": "e7300291.31ae2",
        "type": "Generic BLE in",
        "z": "4f6dc550.741b7c",
        "name": "データ読取り(BLE Nano + ADT7410)",
        "genericBle": "fdb2d38b.bd911",
        "useString": false,
        "notification": true,
        "x": 261.5,
        "y": 124,
        "wires": [
            [
                "440df38e.db025c"
            ]
        ]
    },
    {
        "id": "fdb2d38b.bd911",
        "type": "Generic BLE",
        "z": "",
        "localName": "ADT7410 Temperature",
        "address": "ca:e4:f4:1f:70:2a",
        "uuid": "cae4f41f702a",
        "muteNotifyEvents": false,
        "operationTimeout": "",
        "characteristics": []
    }
]

 

フローが取り込まれます。

 

 

 

 

 

 

"CANDY EGG に送信"と記載されている CANDY EGG websocket ノードに CANDY EGG 利用申込後に送信されるメール記載のアカウント情報を設定します。

 

 

 

 

 

 

CANDY EGG(クラウド側)

CANDY EGG 利用申込後に送信されるメール記載の情報で CANDY EGG にログインし、メニュー → Import → Clipboard から下記のフローをインポートします。

[
{
"id": "e720a493.0791f8",
"type": "CANDY RED websocket in",
"z": "ad203e23.b01e9",
"name": "計測データ取得",
"server": "86749070.1c27",
"wholemsg": "false",
"x": 145,
"y": 59,
"wires": [
[
"3967a605.966b1a",
"bbce6d76.05d3b"
]
]
},
{
"id": "86749070.1c27",
"type": "CANDY RED websocket listener",
"z": "",
"path": "/temperature",
"ignoreRejectError": "false"
},
{
"id": "e84b9b59.64b468",
"type": "http request",
"z": "ad203e23.b01e9",
"name": "データ送信",
"method": "POST",
"ret": "txt",
"url": "",
"tls": "",
"x": 624,
"y": 277,
"wires": [
[
"851b3903.1d9228"
]
]
},
{
"id": "3967a605.966b1a",
"type": "CANDY EGG mysql table out",
"z": "ad203e23.b01e9",
"table": "ffaa1c44.5310c",
"rowProperty": "payload",
"name": "計測データテーブル",
"rowProeprty": "",
"x": 266,
"y": 202,
"wires": [
[]
]
},
{
"id": "851b3903.1d9228",
"type": "debug",
"z": "ad203e23.b01e9",
"name": "デバッグ",
"active": true,
"console": "false",
"complete": "payload",
"x": 803,
"y": 277,
"wires": []
},
{
"id": "65d939bb.eeefb8",
"type": "inject",
"z": "ad203e23.b01e9",
"name": "10分毎に実行",
"topic": "",
"payload": "",
"payloadType": "date",
"repeat": "600",
"crontab": "",
"once": true,
"x": 146.5,
"y": 257,
"wires": [
[
"cb8e7da8.a98c6"
]
]
},
{
"id": "cb8e7da8.a98c6",
"type": "CANDY EGG mysql table in",
"z": "ad203e23.b01e9",
"table": "ffaa1c44.5310c",
"name": "計測データテーブル",
"rowOffset": 0,
"maxRows": "60",
"orderBy": "sensing_time",
"orderByDesc": true,
"filters": [],
"x": 267,
"y": 328,
"wires": [
[
"bf46d216.27692"
]
]
},
{
"id": "bf46d216.27692",
"type": "function",
"z": "ad203e23.b01e9",
"name": "データ集計",
"func": "var sensingDatas = msg.payload.rows;\nvar targetTime = Date.now() - 10 * 60 * 1000;\nvar deviceId = \"\";\nvar totalVal = 0;\nvar dataCnt = 0;\nfor (const sensingData of sensingDatas) {\n    if (sensingData.sensing_time > targetTime) {\n        deviceId = sensingData.device_id;\n        totalVal += sensingData.value;\n        dataCnt++;\n    }\n}\n\nvar value = 0;\nif (dataCnt > 0) {\n    value = totalVal / dataCnt;\n}\n\nmsg.payload = {\n sensing_time: Date.now(),\n device_id: deviceId,\n item: \"avgTemp\",\n value: value\n};\nreturn msg;",
"outputs": 1,
"noerr": 0,
"x": 343.5,
"y": 393,
"wires": [
[
"bbce6d76.05d3b"
]
]
},
{
"id": "bbce6d76.05d3b",
"type": "function",
"z": "ad203e23.b01e9",
"name": "データ変換",
"func": "var data = msg.payload;\nvar sensingAt = new Date(data.sensing_time);\nvar format = 'YYYY-MM-DD hh:mm:ss';\nformat = format.replace(/YYYY/g, sensingAt.getFullYear());\nformat = format.replace(/MM/g, ('0' + (sensingAt.getMonth() + 1)).slice(-2));\nformat = format.replace(/DD/g, ('0' + sensingAt.getDate()).slice(-2));\nformat = format.replace(/hh/g, ('0' + sensingAt.getHours()).slice(-2));\nformat = format.replace(/mm/g, ('0' + sensingAt.getMinutes()).slice(-2));\nformat = format.replace(/ss/g, ('0' + sensingAt.getSeconds()).slice(-2));\nvar sensingAtStr = format;\n\nmsg.payload = {\n    deviceUuid: data.device_id,\n    key: data.item,\n    sensingAt: sensingAtStr,\n    value1: data.value.toFixed(1)\n};\n\nreturn msg;",
"outputs": 1,
"noerr": 0,
"x": 554.5,
"y": 214,
"wires": [
[
"e84b9b59.64b468"
]
]
},
{
"id": "ffaa1c44.5310c",
"type": "CANDY EGG mysql table",
"z": "",
"name": "sensing_data",
"columns": [
{
"name": "sensing_time",
"dataType": "long",
"columnType": "filter"
},
{
"name": "device_id",
"dataType": "string",
"columnType": "filter"
},
{
"name": "item",
"dataType": "string",
"columnType": "filter"
},
{
"name": "value",
"dataType": "float",
"columnType": "value"
}
]
}
]

 

フローが取り込まれす。
処理の流れについて簡単に補足します。
CANDY RED から受信したデータを conect+ WebAPI用に変換し送信します。
また、同時にデータベースへの保存を行います。
保存したデータは、10分毎に平均値を計算して conect+ WebAPI に送信します。

 

 


"データ送信"ノードのURLに、前回設定した conect+ WebAPI の計測データ保存APIのURLを貼り付けます。

https://api.conect.plus/v1/{生成したAPIキー}/data

 

 

 

 

 

解説

今回は conect+ WebAPI に送信するデータ(JSON)の加工処理を CANDY EGG 上で行い、データ送信しています。

実際には下記のようなデータに加工し、conect+ WebAPI に送信しています。

こちらのWebAPI仕様は、conect+ のWebAPI設定画面でも確認可能です。

POST https://api.conect.plus/v1/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/data

{
"deviceUuid": "ADT7410_01",
"key": "temp",
"sensingAt": "2018-01-30 09:00:00",
"value1": 23.1
}

 

  • deviceUuid : デバイスのユニークなIDを指定。今回は、"ADT7410_01"に固定。複数の温度計を使用するなどする場合は別のIDを指定します。
  • key : conect+ のセンサー設定で登録したキーを指定。平均温度では"avgTemp"を指定しています。
  • sensingAt : 計測日時。今回は CANDY RED でデータ計測を行なった日時を指定。
  • value1 : 計測データ。温度センサーで計測した値、または10分毎の平均温度を指定。

 

次回は、実際に計測データを conect+ アプリで確認します。

 

 

c+

今後ともconect+をよろしくお願い致します。

Connecting great Designs with great Technologies.

 


事業提携のご相談などお気軽にどうぞ!

 

相談する(無料)

 

 

無料でIoTアプリをつくる