Cisco Webex Room Kit シリーズ PeopleCount の HTTP POST

Cisco のビデオ会議製品である [Cisco Webex Room Kit](https://www.cisco.com/c/ja_jp/products/collaboration-endpoints/webex-room-series/index.html) および Quad Camera には People Count と呼ばれる会議室内の人数をカウントする機能があります。
これは API により HTTP POST を使って抽出あるいは送信が可能ですが、グラフ化するサンプルとして IOT デバイスの情報からグラフを生成可能な [ThingSpeak](thingspeak.com) を使って解説していきます。 Room Kit 側のソフトウェアは [CE9.6.1 以降](https://community.cisco.com/t5/%E3%82%B3%E3%83%A9%E3%83%9C%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3-%E3%83%89%E3%82%AD%E3%83%A5%E3%83%A1%E3%83%B3%E3%83%88/cisco-webex-devices-ce-9-6-1-%E6%96%B0%E6%A9%9F%E8%83%BD%E3%81%8A%E3%82%88%E3%81%B3%E5%A4%89%E6%9B%B4%E7%82%B9/ta-p/3789753)または Room OS (Webex 登録)が必要です。
thingspeak.com から無料でアカウントを作ることが可能ですので事前に作成しておきます。

## thingspeak チャネルの作成

thingspeak.com にログインし、チャネルを作成します。

Name: Webex Room Kit People Count
Field 1: PeopleCount
それ以外：デフォルトのまま

![1.PNG](https://qiita-image-store.s3.amazonaws.com/0/216119/579070ad-0286-8864-d327-66a2747d3587.png)

空のグラフが表示されています。

![2.PNG](https://qiita-image-store.s3.amazonaws.com/0/216119/5b2fd899-1ba2-025d-0c51-f885b460bfed.png)

## API Key の取得

API Key から Write の権限のある API Key を取得します

![3.PNG](https://qiita-image-store.s3.amazonaws.com/0/216119/dc00eaed-e76b-c9f2-3b91-12b9690dd50f.png)

## POST のフォーマット
HTTP POST のフォーマットを調査します。
[https://jp.mathworks.com/help/thingspeak/writedata.html](https://jp.mathworks.com/help/thingspeak/writedata.html)

Body に api_key と fieldx の Value を json で書き込んでいけばよさそうです。
```
POST https://api.thingspeak.com/update.json
       api_key=XXXXXXXXXXXXXXXX
       field1=123
```



## Webex Room Kit マクロエディタ

Webex Room Kit の Web UI から Integration > Macro Editor でマクロエディタを立ち上げます。
PeopleCount を非通話時にもカウントできるようにします。

```JavaScript
xapi.config.set('RoomAnalytics PeopleCountOutOfCall', 'On');
```

また、HTTP POST をカウント変動のたびに投げるため、HTTPClient モードをオンにします。

```JavaScript
xapi.config.set('HttpClient Mode', 'On');
```

これらはそれぞれ CLI コマンドに対応しています。

```
xconfiguration RoomAnalytics PeopleCountOutOfCall: On
** end

OK
xconfiguration HttpClient Mode: on
** end

OK
```
Web 設定 や SSH で入れてもよいのですが新規で導入することなどを考え、マクロに入れておきます。

## HTTP POST のマクロ

thingsspeak に変数 count を field1 に投稿する postPeopleCount 関数を作成します。API_KEY は環境に合わせた API KEY に変更が必要です。


```JavaScript
const url = 'https://api.thingspeak.com/update.json';
const token = "API_KEY";

function postPeopleCount(count) {
  var payload = { 
    "api_key": token,
    "field1":count
  };
  xapi.command('HttpClient Post', 
  {
    Header: 
    ['Content-Type: application/json'],
    Url: url
  },
  JSON.stringify(payload))
  .then((result) => {
    console.log('HTTP Post was success:' + result.StatusCode);
  }).catch((err) => {
    console.log('HTTP Post was failed:' + err.message);
  });
}
```

xcommand での Http Postは下記のフォーマットになります。

```
xcommand //httpclient ?
xCommand HttpClient Allow Hostname Add
    Expression(r): <S: 2, 200>
xCommand HttpClient Allow Hostname Clear
xCommand HttpClient Allow Hostname List
xCommand HttpClient Allow Hostname Remove
    Id(r): <0..9>
xCommand HttpClient Post
    AllowInsecureHTTPS: <False, True> (default False)
    Header[N]: <S: 0, 1024>
    Url(r): <S: 8, 2048>
xCommand HttpClient Put
    AllowInsecureHTTPS: <False, True> (default False)
    Header[N]: <S: 0, 1024>
    Url(r): <S: 8, 2048>
```
## CA 信頼リスト
なお、Webex Room Kit シリーズをはじめとした CE および Room OS は、HTTP POST で利用できるCA信頼 リストがデフォルトでないため、サーバを信頼できません。AllowInsecureHTTPSを使う手もありますが、パブリックのURL ですので信頼リストをインストールします。

https://api.thingspeak.com/update.json にブラウザでアクセスします。鍵マークをクリックし、証明書からトップレベルの CA を選択した状態でファイルのエクスポートをクリックします。実際のオペレーションはブラウザにより多少異なります。Base64形式で出力する必要があります。
![5.PNG](https://qiita-image-store.s3.amazonaws.com/0/216119/fddaff02-07c9-c0fb-9eea-8656a4b7c446.png)
![6.PNG](https://qiita-image-store.s3.amazonaws.com/0/216119/f17bafc1-ba4f-8e4f-532b-b7d5e126fbc2.png)


Webex Room Kit の Web UIから Security > Certificate Authorities を選択し、先ほどのファイルをアップロードします。
![7.PNG](https://qiita-image-store.s3.amazonaws.com/0/216119/66fd4ac4-6997-8953-5985-7c079afc66d6.png)



## PeopleCount のマクロ

PeopleCount の変動時に先ほどの POST の関数  postPeopleCount() を走らせるマクロを作成し、マクロ起動時に呼び出す記述をします。

```JavaScript
function listenToPeopleCount() {
  xapi.status.on('RoomAnalytics PeopleCount Current', state => {
    postPeopleCount(state);
  });
}

listenToPeopleCount();
```


## 完成

これで完成です。 Webex Room Kit がスタンバイモードに入ったケースなど、カウントが取得できていないときは -1 を返しています。 

![8.PNG](https://qiita-image-store.s3.amazonaws.com/0/216119/35a6b0fe-3d25-285c-034e-adacff388ab2.png)


```JavaScript
const xapi = require('xapi');

const url = 'https://api.thingspeak.com/update.json';
const token = "##API_KEY##";

xapi.config.set('HttpClient Mode', 'On');
xapi.config.set('RoomAnalytics PeopleCountOutOfCall', 'On');

function postPeopleCount(count) {
  var payload = { 
    "api_key": token,
    "field1":count
  };
  xapi.command('HttpClient Post', 
  {
    Header: 
    ['Content-Type: application/json'],
    Url: url
  },
  JSON.stringify(payload))
  .then((result) => {
    console.log('HTTP Post was success:' + result.StatusCode);
  }).catch((err) => {
    console.log('HTTP Post was failed:' + err.message);
  });
}

function listenToPeopleCount() {
  xapi.status.on('RoomAnalytics PeopleCount Current', state => {
    postPeopleCount(state);
  });
}

listenToPeopleCount();
```
## 参考
Cisco Webex Room シリーズコマンド リファレンス
https://www.cisco.com/c/ja_jp/support/collaboration-endpoints/spark-room-kit-series/products-command-reference-list.html#~tab-englishDocumentation

[CE9.6.x - In-Room Control と Macros - USB 入力デバイス、 HTTP POST / PUT と デフォルト UI ボタンの非表示](https://community.cisco.com/t5/コラボレーション-ドキュメント/ce9-6-x-in-room-control-と-macros-usb-入力デバイス-http-post-put-と/ta-p/3774119)

[CE9.2 Macro フレームワークディスカッション](https://community.cisco.com/t5/テレプレゼンス/ce9-2-macro-フレームワークディスカッション/m-p/3310280)