Help us understand the problem. What is going on with this article?

LINE Things×kintoneハンズオン(kintone編)

LINE Things×kintoneハンズオン(kintone編)

by RyBB
1 / 23

kintoneとは

image1.png


kintoneの機能

image2.png


アプリ

image3.png


ワークフロー (プロセス管理)

image4.png


コミュニケーション

image6.png


kintoneカスタマイズ

kintoneはカスタマイズも可能となっており、独自にいじることが可能です。


kintoneが提供しているAPI

image.png

基本的に、kintone上でカスタマイズをするときは kintone JavaScript API を利用します。
レコードのデータをいろいろと利用したいときは kintone REST API を利用します。


ハンズオン

ということで、
LINE Things dev board から送られたデータをkintoneへ貯めるハンズオンを始めます!!


0.必要なもの

  • kintone環境
    • まだ用意されていないの方はこちら からkintoneのお試しを申し込みください
  • エディタ (お好みのもので大丈夫です)
    • VisualStudioCode, Atom, Sublime 等々

1.kintoneへログイン

kintoneへ申し込んだときにメールで送られるURLへアクセスします。

URL: https://{subdomain}.cybozu.com
ログイン名: 登録メールアドレス
パスワード: メールに初期パスワードが記載


1-2.アプリ作成

linethings-kintone_01.gif

  • ログイン後、右側にある「アプリ」の+ボタンからアプリを新規作成
  • 「はじめから作成」を選択
  • アプリ名をわかりやすいものへ変更
  • 「数値」フィールドをD&D
  • フィールドの設定からフィールドコードを num に変更
  • 「フォームを保存」を選択

2.認証情報を取得

linethings-kintone_02.gif

  • 「設定」から「APIトークン」を選択
  • 「生成」を選択してアクセス権の レコード追加 にチェック
  • 生成されたトークンをコピー(メモ)
  • 「保存」を選択して「アプリを公開/アプリの更新」を選択

3.アプリIDを取得

URL部分 https://{subdomain}.cybozu.com/k/100最後の数字部分 がアプリIDをとなります。(この例の場合は100がアプリID)

これでデータベースの用意は完了です。あとは作成したこのアプリに対してherokuからデータを投げます。


4-0.herokuのコードの書き換え

main.py
from flask import Flask, request, abort, render_template
import os
import json
import base64
import urllib.parse
import requests

from linebot import (
    LineBotApi, WebhookParser
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)

# get Token and Secret from token
CHANNEL_ACCESS_TOKEN = os.environ.get('CHANNEL_ACCESS_TOKEN')
CHANNEL_SECRET = os.environ.get('CHANNEL_SECRET')

line_bot_api = LineBotApi(CHANNEL_ACCESS_TOKEN)
parser = WebhookParser(CHANNEL_SECRET)

app = Flask(__name__)

# check server working
@app.route('/')
def do_get():
    return "Hello, from flask!"

@app.route("/callback", methods=['POST'])
def callback():
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    print("Request body: " + body)

    try:
        # Parse JSON without SDK for LINE Things event
        events = json.loads(body)
        for event in events["events"]:
            if "things" in event:
                handle_things_event(event)
            else:
                event = parser.parse(body, signature)[0]
                handle_message(event)
    except InvalidSignatureError:
        print("Invalid signature. Please check your channel access token/channel secret.")
        abort(400)

    return 'OK'

def handle_things_event(event):
    if event["things"]["type"] != "scenarioResult":
        return
    if event["things"]["result"]["resultCode"] != "success":
        app.logger.warn("Error result: %s", event)
        return

    # send message of payload
    try:
        payload = base64.b64decode(event["things"]["result"]["bleNotificationPayload"])
        tempelature = int.from_bytes(payload, 'big') / 100.0
        line_bot_api.reply_message(event["replyToken"], TextSendMessage(text="値を受け取ったよ %s" % (tempelature)))
    except KeyError:
        return

    print("Got data: " + str(tempelature))

def handle_message(event):
    if event.type == "message" and event.message.type == "text":
        line_bot_api.reply_message(event.reply_token, TextSendMessage(text=event.message.text))

if __name__ == "__main__":
    app.debug = True
    app.run()


4.herokuのコード修正

linethings_kintone_handson/main.py を修正します。

main.py
# get Token and Secret from token
# CHANNEL_ACCESS_TOKEN = os.environ.get('CHANNEL_ACCESS_TOKEN')
# CHANNEL_SECRET = os.environ.get('CHANNEL_SECRET')

# line_bot_api = LineBotApi(CHANNEL_ACCESS_TOKEN)
# parser = WebhookParser(CHANNEL_SECRET)

# app = Flask(__name__)

# ↓ Added code
# kintone Settings
URL = "https://{subdomain}.cybozu.com/k/v1/record.json" # change your URL
APPID = 100 # change your App ID
API_TOKEN = "XXXXXXX" # change your Token

kintoneのURL、アプリID、トークンを記載します。

main.py
# def handle_things_event(event):
#     if event["things"]["type"] != "scenarioResult":
#         return
#     if event["things"]["result"]["resultCode"] != "success":
#         app.logger.warn("Error result: %s", event)
#         return

#     # send message of payload
#     try:
#         payload = base64.b64decode(event["things"]["result"]["bleNotificationPayload"])
#         temperature = int.from_bytes(payload, 'big') / 100.0

#         # ↓ Delete 
          line_bot_api.reply_message(event["replyToken"], TextSendMessage(text="値を受け取ったよ %s" % (temperature)))

#         # ↓ Added Post Data Code
          post_kintone(URL, APPID, API_TOKEN, temperature)

#     except KeyError:
#         return

#     print("Got data: " + str(temperature))

# ↓ Added Post Data func
def post_kintone(url, app, api_token, val):
    params = {
        "app": app,
        "record": {
            "num": {
            "value": val
            }
        }
    }
    headers = {"X-Cybozu-API-Token": api_token, "Content-Type" : "application/json"}
    requests.post(url, json=params, headers=headers)

LINEにメッセージを送る処理

line_bot_api.reply_message(event["replyToken"], TextSendMessage(text="値を受け取ったよ %s" % (temperature)))

を削除して、kintoneへデータを登録する処理を追加します。


5.コードのデプロイ

編集した main.py を heroku にデプロイします。
以下のコマンドを1行ずつ実行してください。

$ git add main.py
$ git commit -m "add post kintone"
$ git push heroku master

こんな感じにデータが入れば成功です!

スクリーンショット 2019-07-27 2.41.09.png


6.グラフ作成

kintoneには標準機能でグラフが作れるので、GUIでぽちぽち設定します。
linethings-kintone_03.gif

ただ・・・単位が分単位しかないので正直つらいです・・・
スクリーンショット 2019-07-27 10.29.48.png

なので作成日時ではなく、もう一つフィールドを用意してそのフィールドを並べる 裏技 的な方法をお教えします


7.フィールド追加

新たに 文字列(1行) フィールド を配置して、フィールド名を 日時 に、フィールドコードを time に変更してアプリを更新します。
linethings-kintone_04.gif

これでもう一つデータを格納するカラムが追加されます。


8.コードの修正

現在日時を取得してその値を先ほど作成した 日時 に入れるように main.py を修正します。

現在日時を取得する datetime をインポートします。

main.py
# from flask import Flask, request, abort, render_template
# import os
# import json
# import base64
# import urllib.parse
# import requests

# ↓ add
from datetime import datetime, timedelta, timezone

JSTで現在日時を取得して time に格納する処理に変更します。

main.py
def post_kintone(url, app, api_token, val):
    JST = timezone(timedelta(hours=+9), 'JST')
    now = datetime.now(JST).strftime("%Y/%m/%d %H:%M:%S")
    params = {
        "app": app,
        "record": {
            "num": {
                "value": val
            },
            "time": {
                "value": now
            }
        }
    }
    headers = {"X-Cybozu-API-Token": api_token, "Content-Type" : "application/json"}
    requests.post(url, json=params, headers=headers)

再度、heroku へデプロイします。

$ git add main.py
$ git commit -m "add post nowTime"
$ git push heroku master

こんな感じに現在日時も登録されればOKです!

スクリーンショット 2019-07-27 11.02.26.png


9.グラフの再設定

グラフの軸を 日時 に、集計方法を 合計 に変更してグラフを作成します。
linethings-kintone_05.gif


画面カスタマイズ

kintoneの標準機能のグラフでもそこそこ作れますが、もっと作り込むことも可能です。
(HTML、JS、CSSによるカスタマイズ)
スクリーンショット 2019-07-27 14.19.20.png


おわりに

kintoneに貯めることで、その後データも扱いやすく、
エンジニア以外も利用できるようになります!

ただ、kintoneへのリクエスト数にはお気をつけくださいm(_ _)m
※ 1日1アプリ10000リクエストが上限です。つまり毎秒単位でデータを送ると警告メールがきます。
60 * 60 * 24 = 86400!

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away