kintoneGeeks blog

kintoneに関連する情報を発信しています

【kintone×obniz×MESH】Web会議始動システムを作成

はじめに

2022年9月28日~2022年11月30日の間で、kintone×obniz×MESHのDXコンテストの募集を行っています。
※詳細はこちらで確認ください。
まずはコンテストのサンプルとして簡単な作品を作ってみました。
こちらの記事では作ったものの紹介と、技術的な内容を網羅的に記載します。

作ったもの

Web会議始動システム
少しgifではわかりにくくなっておりますが、Buttonブロックを押すことによって、今の時間のZoom会議室を自動で起動し、照明を付けちょうどよい照度に調整します。

ここ数年でWeb会議が一気に浸透してきましたね。
自室・会社のブース・会議室など、色んな所でWeb会議をされていると思います。
ところで、Web会議をするときのこと、思い返してみてください。

  1. Web会議用の部屋に移動
  2. 照明を調整する
  3. グループウェアなどにアクセスする
  4. スケジュールを開く
  5. スケジュールにあるWeb会議用リンクを探してクリック

なんだかんだで全員待っていると数分くらい経っている…なんてよくあることだと思います。
特に15分とかの短い会議だと致命的ですよね。
今回は、そんなWeb会議をスムーズに開始できるソリューションを作成しました。

以下のフローチャートによって動作するので、各項目ごとに説明していきます。

システムフローチャート

システム詳細

システム構成

システム図
※スマート電球はSwitchbotを利用しております。本記事ではスマート電球のAPI操作などの技術的な説明は割愛します。

事前準備編

kintone予定管理アプリ

まずは中心となっているkintoneのアプリに関しての説明です。
kintoneでは標準機能で実現できない機能を追加するために、プラグインというものが利用できます。
このシステムではそんなプラグインのうち、カレンダーPlusというプラグインを利用します。 詳細はリンク先をご参照お願いします。
簡単に説明すると、予定を1レコードで登録でき、普段皆様がお使いのスケジュールのような表示が可能になっています。
今回は、kintoneアプリのフィールドとして準備した、「予定開始日時」「予定終了日時」「ZoomURL」の3つを利用していきます。

予定管理アプリ

kintoneからのデータ取得

kintoneはREST APIを用いてデータを取得することが可能なサービスとなっています。
今回のシステムではベースはnode.jsとなるので、こちらのkintone JavaScript Clientを利用します。

以下のコードでは分かりやすさのために認証用のAPIトークンをハードコーディングしています。本番での利用ではセキュリティの観点から環境変数で設定しましょう。

処理の内容としては、指定したクエリをアプリに対して実行し、該当するレコードがあれば処理①を、なければ処理②としています。

'use strict';
const { KintoneRestAPIClient } = require('@kintone/rest-api-client');

// クライアントの作成
const client = new KintoneRestAPIClient({
  baseUrl: 'https://{ドメイン名}.cybozu.com',
  auth: {
    // username: 'ユーザー名',
    // password: 'パスワード'
    apiToken: アプリから取得したAPIトークン
  }
});

const get_kintone_schedule = async() => {
    // リクエストパラメータの設定
    const APP_ID = アプリID;
    const body = {
        app: APP_ID,
        query: レコードに対するクエリ
    };

    // レコードの取得
    const response = await client.record.getRecords(body);
    if(response.records.length){
        // 処理①
    }
    else{
        // 処理②
    }
}

obniz BLE/Wi-Fiゲートウェイ Gen2.0×MESH

2022年8月末より、株式会社 obniz(以下obniz)のBLE/Wi-Fiゲートウェイ Gen2.0ソニーマーケティング株式会社(以下ソニーマーケティング)のMESHがBLEでの接続が可能となりました。
もともとスマホアプリなどで簡単にIoTが作れたMESHでしたが2022年8月末に通信仕様などの技術資料を公開し、アプリ以外からも利用できるようになっています。
例えばMESHのBrightnessブロックはアプリでは照度に関して10段階でしか判断できなかったものが、直接利用することで0 ~ 655,350 [lx]を10lx刻みの値で取得できるようになっています。
他にも色々とあるので、興味ある方はぜひ読んでみてください。

ただ、Bluetoothはやはり技術的にも少し難易度が高く、PCのBluetoothを使おうにもOSの操作と競合してうまく行かない…など私も何度か経験があります。
しかしながら、上記記載の通り、obnizのゲートウェイとBLE接続ができるようになったことから、obnizが提供されているnode.jsのモジュールと技術資料を併せて利用することで簡単に開発できるようになっています。

ここでは、Brightnessブロックのデータをnode.jsを使って取得するサンプルについて説明します。
説明はコメントを参考にしてください。
基本的には接続はこちらデータ取得はこちらを参考にしています。

// obniz社のモジュールの読み込み
const Obniz = require('obniz')
const OBNIZ_ID = 'あなたのゲートウェイのID'
const obniz = new Obniz(OBNIZ_ID);

// ゲートウェイと接続された際に実行される
obniz.onconnect = async function () {
  const MESH_100PA = Obniz.getPartsClass('MESH_100PA');
  await obniz.ble.initWait();

  // この関数でBLEデバイスのScanを実施
  await obniz.ble.scan.startWait(); 

  // デバイスが見つかった際にデバイス情報がperipheralに入り、実行される
  obniz.ble.scan.onfind = async (peripheral) => {
      if (!MESH_100PA.isMESHblock(peripheral)) {
          return;
      }
      console.log('found');
  
      // Create an instance
      const brightnessBlock = new MESH_100PA(peripheral);
  
      // Connect to the Brightness block
      await brightnessBlock.connectWait();
      console.log(`connected: ${brightnessBlock.peripheral.localName}`);
      
      // Get sensor data
      const res = await brightnessBlock.getSensorDataWait();
      console.log('proximity: ' + res.proximity + ', brightness: ' + res.brightness);
  };
}

ほとんどobnizの記事にあるとおりで、このままで簡単にnode.jsで値の取得が可能となります。

システム内容

それでは準備が完了したところで、先程お見せしたシステムの構築をしていきます。
今回作成するものはサンプルですので、エラー処理や複雑な条件下でそのまま動作するものではないです。
あくまで概要を知っていただくのを目的としておりますので、その点ご承知おきください。

MESHのButtonブロックでは以下の通り記載することで、単押し・長押しによる処理の分岐が可能です。
こちらも、obnizの記事をほぼそのまま流用しております。
kintoneに今の時間に予定があるかどうか?は前準備のコードで、queryとして予定開始日時<NOW() and 予定終了日時>NOW()を与えています。
このクエリを与えることで、そのクエリに当てはまるレコードがあれば処理①を、なければ②を行うような処理にしております。
また、whileの中身に関しましては、照明の明るさを徐々に明るくしていき、しきい値に達したらwhileループから抜け出すような処理にしております。

APIで利用できる照明として、Philips社製のHueとSwitchBot社製のスマート電球がありました。
本システムではSwitchbot社製を利用しています。
APIは1日10000回の制限があるのと、API実行順もキューで管理されているわけではなさそうで、照明を暗くする→照明をオフにするという順にウェイト無しで送信した場合、成功応答が返ってくるものの照明がオフになって暗い明るさで照明がオンになるなど、送った順とは無関係に処理が実行されてしまうこともありました。
そのため、ウェイトを設けるなど工夫が必要となります。

obniz.onconnect = async function () {
    await obniz.ble.initWait();
    const MESH_100BU = Obniz.getPartsClass('MESH_100BU');
    await obniz.ble.scan.startWait();
    obniz.ble.scan.onfind = async (peripheral) => {

        if (MESH_100BU.isMESHblock(peripheral)) {
            console.log('found');

            // Create an instance
            const buttonBlock = new MESH_100BU(peripheral);

            // Connect to the Button block
            await buttonBlock.connectWait();
            console.log(`connected: ${buttonBlock.peripheral.localName}`);
            
            // Single Pressed Event
            buttonBlock.onSinglePressed = (async () => {
                
                kintoneデータ取得処理
                if(kintoneに今の時間の予定がない){
                    return;
                }
                kintoneにあるZoomURLを開く
                照明を照度低くON

                while(1){
                    ①Brightnessブロックから照度を取得
                    if(照度がしきい値より高い?){
                        break;
                    }
                    ②明るさ = 明るさ + 5// 電球の明るさが1~100の範囲を設定できるものとする
                    ③更新した明るさで照明の明るさを更新
                    ④必要に応じて適度なウェイトを入れる(APIでの照明操作の場合、製品によってラグ等があるので注意)
                }
            });

            // Long Pressed Event
            buttonBlock.onLongPressed = (async () => {
                ①照明をオフにする
            });

            await obniz.ble.scan.startWait();
            return;
        }
    };
}

まとめ

kintone×obniz×MESHのプチDXコンテストのサンプルを作成してみました。
簡単な構成ではありますが、イチからBluetoothの実装含め作成すると膨大な時間がかかってしまいます。
そこをobnizのゲートウェイソニーマーケティングのMESHを組み合わせることで非常に短時間で簡単に作れてしまうため、ハードウェア、無線周りにハードルを感じていた方には特に刺さる連携に感じています。
皆様も、業務で日常感じている少し不便な何かをkintone×obniz×MESHで解決してみませんか?
ご応募お待ちしております! (※応募期間 ~2022年11月30日)