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.