conect+ | IoT Data Design

© conect.plus Corp. All Rights Reserved.

  • conect+

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

最終更新: 2019年12月5日

こんにちは、conect+の中の人(エンジニア)です。 ラズパイ向け3G/LTE通信ボードである CANDY LINE 社の CANDY Pi Lite と conect+ WebAPI を接続して、 カンタンにIoTアプリを体験してみます。

センサーには温度センサー(アナログ・デバイセズ社製ADT7410)を使用します。

BLE Nano と温度センサーを使って温度計を作るサンプルは下記のサイトに詳しく紹介されています。

温度センサーを使おう

全体構成は下記のようになります。

初回は、ラズパイ、CANDY Pi Liteのセットアップを行います。


準備

今回用意したものは以下になります。

  1. Raspberry Pi 3 Model B

  2. CANDY Pi Lite LTEモデル

  3. 温度センサー(アナログ・デバイセズ社製ADT7410)

  4. Raspberry Pi用電源セット(5V 3.0A)

  5. SDカード

  6. キーボード

  7. モニタ、HDMIケーブル


OS(Raspbian)のセットアップ

OSのセットアップですが、CANDY LINE 社から展開されていますCANDY Pi Lite向けのOSイメージを利用します。 今回はv1.2.0のイメージを使用しました。

セットアップの詳細は、下記の記事を参考にさせていただきました。 Etcherを使ってCANDY Pi Lite専用イメージを焼いてみましょう


CANDY Pi Lite の接続

前項でOSイメージを焼いたSDカードをラズパイに挿入し、 CANDY Pi Lite 同梱の説明書を参考に CANDY Pi Lite をラズパイに接続します。

電源をラズパイにつなぎ起動したらラズパイのIPアドレスを確認し、CANDY REDにアクセスしてみます。

$ ifconfig

・・・

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.3.224  netmask 255.255.252.0  broadcast 192.168.3.255
        inet6 fe80::a456:2224:143d:2d62  prefixlen 64  scopeid 0x20
        ether b8:27:eb:10:23:24  txqueuelen 1000  (イーサネット)
        RX packets 679  bytes 69637 (68.0 KiB)
        RX errors 0  dropped 1  overruns 0  frame 0
        TX packets 211  bytes 35622 (34.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

下記のURLからアクセスします。

http://XXX.XXX.XXX.XXX:8100

XXX.XXX.XXX.XXX にはラズパイの有線LAN、もしくは無線LANのIPアドレスを指定します。 CANDY REDにはインターネット(4G/LTE)からはアクセスできません。

CANDY RED のログイン画面が表示されれば問題なくセットアップできています。 Usernameに「pi」、PasswordにOS上のpiユーザーに設定しているパスワードを入力してログインします。

次回は conect+ の Web API、アプリ設定を行います。


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

今回はconect+での設定方法についてお伝えします。

基本的には、以前の記事「Raspberry Piとconect+をWeb APIでつなげてみた!」で設定した内容と同じですので簡単に解説します。

製品登録

まず、製品の追加です。

基本情報で重要なのは、「接続方法」で"WebAPI"を選択することです。

「製品名」には分かりやすい名前を設定します。

「アプリテーマ」では"スカイ"を選択しました。

続いてセンサーの登録を行います。今回は温度センサーのみの接続ですが、CANDY EGG で平均温度の計算も行います。

センサータブに移動して、追加(+)ボタンを押下します。

ポップアップダイアログの「キー」に、温度センサーは"temp"を平均温度には"avgTemp"を設定し、追加ボタンを押下します。

基本情報入力後は、保存ボタンを押下して保存してください。

アプリウィジェット設定

アプリウィジェット設定画面にて、温度センサー、平均温度と連携させるウィジェットを追加し、センサーと紐付けを行います。

WebAPI仕様確認

WebAPI画面にて、APIキーを生成します。

APIキー保存後、WebAPIリファレンスが表示されますので、計測データ保存APIのURLを確認します。

次回の CANDY EGG 設定に使用します。

以上でconect+の設定は完了です。

次回は CANDY RED、CANDY EGG 上でのフローの作成を行います。

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

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

CANDY RED(ラズパイ側)

[
    {
        "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 に送信します。

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
}

  1. deviceUuid : デバイスのユニークなIDを指定。今回は、"ADT7410_01"に固定。複数の温度計を使用するなどする場合は別のIDを指定します。

  2. key : conect+ のセンサー設定で登録したキーを指定。平均温度では"avgTemp"を指定しています。

  3. sensingAt : 計測日時。今回は CANDY RED でデータ計測を行なった日時を指定。

  4. value1 : 計測データ。温度センサーで計測した値、または10分毎の平均温度を指定。

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


第三回では CANDY RED、CANDY EGG でフローの作成を行いました。

最終回では、温度センサーから取得した計測データを conect+ アプリで確認します。

センサー → ラズパイの接続確認

センサーを起動して、ラズパイで計測データを受信すると、CANDY RED の debug ビューに摂氏温度に変換したデータが出力されます。

ラズパイ → CANDY EGG → conect+ WebAPI の接続確認


conect+ アプリでデータ表示

まずは、AppStoreからconect+をインストールします。

アプリを起動してログイン後に製品を追加し、デバイスIDの設定で"ADT7410_01"を入力します。

データ連携が正しく動作すれば下記のようにスマホアプリで計測データが表示出来ます。

以上、4回にわたりラズパイ、CANDY Pi Lite とconect+との連携方法を解説いたしました。

WebAPIを使用すれば、とてもカンタンにconect+に接続し、IoTアプリのUIを生成できることを感じていただけたと思います。

IoTアプリにご興味のある方は、是非conect+をお試しください。

60回の閲覧