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,iVBORw0KGgoAAAANSUhEUgAAAGAAAABgCAYAAADimHc4AAAIGUlEQVR4Xu2deWzURRTHP7u9aGlLW9oCAnIUOQWhiKjxPgHv+0rAYDxQEzXRqDFqotHgEY0m3ppIInglJgaNxhiUQ+SoihULFgQU5SiU3vbumse4Lkppf/vb+f1mtzsvIfzBzDu+3535zfHmEQiFQiGsGEMgYAkwhv1Bw5YAs/hbAgzjbwmwBJhGwLB9+w2wBBhGwLB5OwIsAYYRMGzejgBLgGEEDJu3I8ASYBgBw+btCLAEGEbAsHk7AiwB3SDw12bY8zbUrYaG9dDVEmmUWgC5J0LBuTD4RkjNMwxhbObjYwR0NkP9Gqj+GPYvhZZtzqIKpP9DxmwougKyjnHWL45amSegdTdU3gq1X0Nng0togpBeDIPnw+gnXOow080cAV1tsPsN2PEotFfriz5rPIx5AfLPga5WaPoRGjZA3QpoqoBQa8RWWhFkT4W809Tf/UZDIKjPFweazBDQvh+23gNVH/4XEAcOO2qSmg8jH4GaL6F+LbQfALqO3FWmsvTBUHQVjHocUjIdmdHRyH8COupg0zw138ejZB8HJc+qEeSD+EuATAk/XwHVn/X8i/Qh8B5NpA6EkQ/D0DshkOKpN/4REOqE356EHY94GpA25Sk5MOlDKDhfm8ruFPlHQP16+GkOyPyfKJIxAqZ8Bv0neOaxPwR0tcP3M6HxB88C8Uxx3hkweSmkZHtiwh8CZLVTcbUnAXiuVICfsBgKL/bElPcEyC634hqoXupJAL4oHXITjHvTE1PRE9D6B9R9Cw1roXEjtO8BWVqG5eCauhiyJqjNTfogqFwA7fs8CcAXpelD4MTtEMzQbs45AZ2NsP1h2LsYOmoh1O7AmRQIpHqz2XJgXWuT0rWQe4JWlaKsdwIE7L1L4PeF0LpTuwMJo3DM8zDsbu3u9kxAyw6ouA4ayiDUod14Qikcfj+ULNTu8pEJaPwRNt8IjRu0G01IhUNuhrGvQEdN5GwpvKeR715qLgT7QVoxpGQ5DrF7AurXwc9XQ+tvjhX1+YY5J6i9QEc1dNSro5Tw4kO+cyn9IZABaQWQOUadJRXMUouQHuRwAuRjWz4H6lb2eUy9DzAYubmTW7yMow877j6cgM3zYc+i+D4s8x45/RbknmLgBerSqP/EyKr93zdi8lbvwOfqvMaKdwikDYJRj6n77GD6IcvQzia14knkHat3sLnXHEiDzBLIOV7duMlIkESC3JkHvxeRKaj5V1g3EUJt7o3ZnmrjGcxUAMsNW+ElPX6IIwRsvRv+eMFC6BYBWSENvAjyz1V3zPKrdyARAlYOgE5ZXlmJGoHCy2HsS+peOUpRBMi6X87rrUSHQOGlMOwukDsDl6IIqHofKq51qSIJu6Xkwvi3oGA2BLMgEHANgiJADtq2PehaSdJ1nLoCBpwSE/BhzCwBbn4907+HnGlueh7WxxLgBsZxb8GQ+W56WgK0oDb8Phi9UEsaoxoBf74KWxZo8S0plBRfB+MXQTAt5nAVAbUrYMPpMStLGgV5p8OUz9X5f4yiCJDMhVUDHN7zxmixL3SXFdCUL7Qk8UZ2wnIQV/VeX4DH+xj6Hwula9QlTIwSIaBuFfxwaozqkqS79ilIcJPrtfILoP6bJEExhjDzz4bJn2j8BogvciGz+3WovC0Gz5Kk66C5KlNO2yoojJvcB/90IdQuTxIkXYY54iEY+ZjGfcChfsiNf1kptPzq0rsk6CbvBoqu1BJo92kp+z6CTXOhq0mLkT6nZOYWlXqiQbonQLLg5Ii68g7oPCTxVoPBhFchuT6TP9Uy/QgWPacm1ixTb3ibtyY8bloCkLve0tUq61uT9J6cK2UDfn8a9r5jd8pyyT7pA03QKzW9ExA2JyujrXepNwF0anUiIZTJpfvE91RylUZxToAYldSV8lnJOSUNu0cdQQfTNcIfzQgQs5KuXj4bZFpKJsk9Sc39Hkh0I0Ce/MtGrf5bD1yJU5X9RsCkjyCn1BMHoyNAXNh4KeyP0zIDuiGSeX96GWSN0635X33REyDZE5JF0dclZwaMfVnldHoo0RMgGdTyHejLUnw9HPMiSHWuGHJ+nEAUPQFScGPNaGjb5UR/4rSRLGbZYA2/FyTjTfNq50hARE+AaPrzJdhyZ+KA25unMs3IMlMSa9OLemut9d/dEdC2B8qmQtterc74rkyuFCd+AAPNPUpxR4CUntn2AOx81nfMtBo8+n4Y9aS2gzU3vrkjQCw1b4fvZqhXg4ko2dPh+DLjnrsnQFyv+Qo2XpZ4R9ZS++HYjyF3RoITEOpSe4LtDxkPxJkDAcgYCscti5sao7GNAIlaHvf9cjNUvesMA5Ot8s+Dkqe0nufHGk7sBIQ9qLwddr3m/fti2RwNvUPVHJXVmBNJK4SSZ9TT0DgTfQTISNj1qpqSvKoLlz0NSp6GvLNUPenaZaq+dFM5tOyMvHGTMxypfCglKCWNUBKppIZRHIo+AiQ4yS2SyiqbboDmLXrDHTQPxjynajEcKmJTntYerOYS/o9h5clQUO1mPS47GWuQegkIe9Neo6aIqiUgVVfcimQf550JR90CBXN8Ox5w666bft4QEB4NklHRWK6mpQNSrNWhCPBHLVAFkqS+s4+lhB16qK2ZdwT830UZFXXL1RQlmzjJOZIkMKnDJn+k3nPmWDVfDzhZW4Dxrsg/ArpDQj7ccgrp08ljPJJhloB4RMRnnywBPgP+f3OWAEuAYQQMm7cjwBJgGAHD5u0IsAQYRsCweTsCLAGGETBs3o4AS4BhBAybtyPAMAF/A7huUw5U4iCQAAAAAElFTkSuQmCC",
        "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) にいろんなサンプル(レシピ)が載っていますので、参考にしてください。