MESH を使ってドアの開閉を kintone に通知しよう

著者名:サイボウズ 竹内 能彦

目次

はじめに

今回はMESHの動きタグを使ってドアの開閉をkintoneのスペースとアプリに投稿します。
MESHとは小さなブロック形状の電子タグで、動き、ライト、ボタン、明るさなどのセンサー機能を持っています。
アイコンをつなげるだけでLEDを点灯させたり、音を鳴らしたりできるんですよ。
MESHの詳細については MESH (External link) を確認してください。

MESH 連携の背景

サイボウズの大阪オフィスは梅田阪急ビルオフィスタワーの35階にあります。
サイボウズ大阪オフィスのHP (External link) によると、「JR大阪駅、阪急梅田駅、阪神梅田駅、地下鉄では御堂筋線の梅田駅」から徒歩5分以内という好立地で、景観もすばらしいです。

そんな大阪オフィスでは、休みの日にカップルや家族で訪れる社員が多いです。
そのため、鉢合わせ問題が発生していました。
そこでMESHを使って、鉢合わせないようなしくみを考えてみました。

概要

ドアが開閉したらMESHからkintoneに通知を送ります。
これで誰かが大阪オフィスにいることが分かります。
「誰がいるのかはわからない」というゆるさが大事だったりします。

注意事項

  • MESHの近くにスマホがないと動作しません。
  • ドアが開いたのか、閉じたのかは今回のサンプルではわかりません。
    そのため、何回も開閉するとそこに人がいるのかどうかわからなくなります。
    厳密に管理したい場合はボタンタグを2つ設置したり、明るさタグを利用する必要があります。

結果

こんな感じで動きタグのMESHをドアに貼り付けます。(ドアの右上にある青いタグがMESHです)

今回は2つのサンプルを作りました。

  1. ドアが開閉されるとkintoneのアプリに登録

  2. ドアが開閉されるとkintoneのスペースに通知

kintone の設定(アプリに投稿する場合)

kintone アプリの作成

次のフィールドをフォームに設置します。

フィールド名 フィールドタイプ フィールドコード
ドア開閉日時 作成日時 作成日時
どのドア? 文字列(1行) doorName

API トークンの生成

レコード追加権限のあるAPIトークンを生成します。

アプリIDとAPIトークンはMESHの設定で利用するのでメモしましょう。
アプリIDはURLから確認できます。
投稿したいアプリを開きます。
そのURLがhttps://xxxxx.cybozu.com/k/674/の場合、「674」がアプリIDになります。

kintone の設定(スペースに投稿する場合)

スペースを作成し、スレッドを作成します。

スペースIDとスレッドIDはMESHの設定で利用するのでメモしましょう。
スペースIDとスレッドIDはURLから確認できます。
投稿したいスレッドを開きます。
そのURLがhttps://xxxxx.cybozu.com/k/#/space/9/thread/24の場合、「9」がスペースID、「24」がスレッドIDになります。

MESH の設定

SDK のアカウント登録

MESH SDK (External link) からアカウントを登録します。

SDK にインポート

SDKにログインし、「Create New Tag」をクリックします。
「Import」をクリックします。

アプリに投稿したい場合は次のpostToApp.jsonを、スペースに投稿したい場合はpostToSpace.jsonをインポート(jsonファイルの内容をコピペ)します。
今回は「スペースへの投稿」と「アプリへの投稿」を2つのタグに分けていますが、1つのタグにまとめることも可能です。
詳細は タグの構成要素と属性 (External link) を参考にしてください。

インポート後、kintoneの設定でメモした内容を参考にPropertyのDefault Valueを書き換えます。

return構文などMESH独特の記述については MESH SDK Reference Manual (External link) を参考にしてください。

  • postToApp.json

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    
    /*
     * kintone x MESH
     * Copyright (c) 2016 Cybozu
     *
     * Licensed under the MIT License
     * https://opensource.org/license/mit/
     */
    {
      "formatVersion": "1.0",
      "tagData": {
        "name": "アプリに投稿",
        "icon": "data:image/png;base64,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",
        "description": "ドアの開け閉めをアプリに投稿する",
        "functions": [
          {
            "id": "function_0",
            "name": "postToApp",
            "connector": {
              "inputs": [
                {
                  "label": ""
                }
              ],
              "outputs": []
            },
            "properties": [
              {
                "name": "ドメイン名",
                "referenceName": "domain",
                "type": "string",
                "defaultValue": "{subdomain}.cybozu.com"
              },
              {
                "name": "アプリケーションID",
                "referenceName": "appId",
                "type": "number",
                "defaultValue": "0"
              },
              {
                "name": "APIトークン",
                "referenceName": "apiToken",
                "type": "string",
                "defaultValue": "your api token"
              },
              {
                "name": "ドアの名前",
                "referenceName": "doorName",
                "type": "string",
                "defaultValue": "your door name"
              }
            ],
            "extension": {
              "initialize": "",
              "receive": "",
              "execute": "/*\n * MESH sample program\n * Copyright (c) 2016 Cybozu\n *\n * Licensed under the MIT License\n*/\nvar url = \"https://\" + properties.domain + \"/k/v1/record.json\";\nvar appId = properties.appId;\nvar apiToken = properties.apiToken;\nvar doorName = properties.doorName;\n\nvar data = {\n\t\"app\": appId,\n\t\"record\": {\n\t\t\"doorName\": {\n\t\t\t\"value\": doorName\n\t\t}\n\t}\n};\n\najax ({\n    url : url,\n    data : JSON.stringify(data),\n\ttype : \"POST\",\n    contentType : \"application/json\",\n    dataType : \"json\",\n    timeout : 5000,\n\theaders: {\n\t\t\"X-Cybozu-API-Token\": apiToken\n\t},\n\tsuccess : function ( contents ) {\n        log(\"success\");\n         \n    },\n    error : function ( request, errorMessage ) {\n        log(\"error\");\n\t\tlog(request.responseText);\n\t\tlog(errorMessage);\n    }\n});\n \nreturn {\n    resultType : \"pause\"\n};",
              "result": ""
            }
          }
        ]
      }
    }
  • postToSpace.json

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    
    /*
     * kintone x MESH
     * Copyright (c) 2016 Cybozu
     *
     * Licensed under the MIT License
     * https://opensource.org/license/mit/
     */
    {
      "formatVersion": "1.0",
      "tagData": {
        "name": "スペースに投稿",
        "icon": "data:image/png;base64,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",
        "description": "ドアの開け閉めをスペースに投稿する",
        "functions": [
          {
            "id": "function_0",
            "name": "postToSpace",
            "connector": {
              "inputs": [
                {
                  "label": ""
                }
              ],
              "outputs": []
            },
            "properties": [
              {
                "name": "ドメイン名",
                "referenceName": "domain",
                "type": "string",
                "defaultValue": "{subdomain}.cybozu.com"
              },
              {
                "name": "アカウント名",
                "referenceName": "account",
                "type": "string",
                "defaultValue": "your account"
              },
              {
                "name": "パスワード",
                "referenceName": "password",
                "type": "string",
                "defaultValue": "your password"
              },
              {
                "name": "スペースID",
                "referenceName": "spaceId",
                "type": "number",
                "defaultValue": "0"
              },
              {
                "name": "スレッドID",
                "referenceName": "threadId",
                "type": "number",
                "defaultValue": "0"
              },
              {
                "name": "ドアの名前",
                "referenceName": "doorName",
                "type": "string",
                "defaultValue": "your door name"
              }
            ],
            "extension": {
              "initialize": "",
              "receive": "",
              "execute": "/*\n * MESH sample program\n * Copyright (c) 2016 Cybozu\n *\n * Licensed under the MIT License\n*/\nvar url = \"https://\" + properties.domain + \"/k/v1/space/thread/comment.json\";\nvar account = properties.account;\nvar password = properties.password;\nvar spaceId = properties.spaceId;\nvar threadId = properties.threadId;\nvar doorName = properties.doorName;\n\nvar data = {\n\t\"space\": spaceId,\n\t\"thread\": threadId,\n\t\"comment\": {\n\t\t\"text\":  doorName + \"のドアが開いたよ! (閉まったよ)\",\n\t\t\"mentions\":\t[\n\t\t\t{\n\t\t\t\t\"code\": \"OsakaOffice\",\n\t\t\t\t\"type\": \"GROUP\"\n\t\t\t}\n\t\t]\n\t}\n};\n\najax ({\n    url : url,\n    data : JSON.stringify(data),\n\ttype : \"POST\",\n    timeout : 5000,\n\theaders: {\n\t\t\"X-Cybozu-Authorization\": btoa(account + \":\" + password),\n\t\t\"Content-Type\": \"application/json\"\n\t},\n\tsuccess : function ( contents ) {\n        log(\"success\");\n     },\n    error : function ( request, errorMessage ) {\n        log(\"error\");\n\t\tlog(request.responseText);\n\t\tlog(errorMessage);\n    }\n});\n\nreturn {\n    resultType : \"pause\"\n};",
              "result": ""
            }
          }
        ]
      }
    }

アプリケーションの設定

モバイルにMESHアプリをインストールし、MESHのタグと接続します。

SDKにログインします。

アカウント情報を入力します。

右下のカスタムの追加をタップします。

先ほどインポートした2つのカスタムタグを追加します。

MESHタグとカスタムタグをドラッグ&ドロップで配置し、コネクタもドラッグ&ドロップで接続します。

MESHのタグをタップして、感度と感覚を設定します。
今回はドアの開閉を取得したいので以下のとおり設定しました。

おわりに

これで休日夜景を楽しんでいるときにアタフタすることが減りそうです。
MESHにはさまざまなセンサーが搭載されているため、多様な使い方が可能です。
MESH レシピ集 (External link) にいろんなサンプル(レシピ)が載っていますので、参考にしてください。