※milkcocoa終了に伴い、BaasをBeeBotteに変更する方法について記載しております。
前回、「(3′)BeeBotte版ArudinoでESP8266のプログラミング」で会議室センサーIoTデバイスへのプログラミングを行いました。
これまでIoTセンサーの製作、IoTサーバのセットアップ、IoTデバイスのプログラミングが完了し、今回は最終回である「JavascriptでIoTセンサーの状態表示サイトの作成」を行います。
1. 会議室使用状況センサーの実装構想(振り返り)
少し目標を変更して、会議室に自作したIoT人感センサーを設置して、会議室センサーの状態を会社のSharePointに表示させることを目標としました。
- マイコンと人感センサーを使って電子工作(IoTデバイス製作)
- センサーデータの保管先IoTサーバのセットアップ(BeeBotte編)
- IoTデバイスである会議室センサーのプログラム修正(BeeBotte編)
- JavaScriptで簡単なページを作成して、IoTサーバの情報を取得しSharePointで表示←今回はこちらの話
2. データ取得のための基本的なAPI
Javascriptでも特に何かダウンロードする必要はなく、直接BeeBotteのサイトから必要なAPIは参照する形で問題ないです。
BeeBotteのサイトのDocumentationのClientAPIやTutorialsを参照して、コーディングしていきます。
3. 今回のデータ取得の仕組み
読み込み方法が少し異なるので前回のmilkcocoa版から仕様を少し変更しました。
会議室センサー側のステータス更新(MQTTでPush)仕様
- センサーがONの状態が6秒続けば、IN USEステータスをサーバに保管
- センサーがOFFの状態が30秒続けば、Vacantステータスをサーバに保管
- ステータスに変化がない場合はセンサーの死活監視用として、60分おきに現状ステータスをサーバに保管
Webサイト側のステータスを取得(ClientAPI)仕様
過去10件分のデータを取得→ ルーム毎に直近1件分のデータを取得かつ、過去70分間のデータを取得→ かつ、過去70分間以内のデータのみを取得
4. Webサイト用プログラムの作成
SharePointでは、HTMLをそのまま設置することが可能です。ただし、拡張子は.htmlではなく、.aspxに変更する必要があります。
4−1. HTML全文
以下、HTML文全文を掲載しますが、#93あたりからのマーカされた部分を各自の環境に合わせて変更する必要があります。
また、マップのPNGイメージファイルは、前回のmilkcocoa版「(5) センサー状態をサイボウズガルーンに表示」を参照してください。
<!DOCTYPE html>
<html>
<head>
<title>Conference Information</title>
<meta charset="UTF-8">
<script>
setTimeout("location.reload()",60000); // 1分毎にリロード
</script>
</head>
<body>
<style type="text/css">
.Label_Use {
position: absolute;
display: table;
padding: 5px 5px;
color: white;
background: #0000cd;
}
.Label_Vacant {
position: absolute;
display: table;
padding: 5px 5px;
color: white;
background: #32cd32;
}
.Label_OOS {
position: absolute;
display: table;
padding: 5px 5px;
color: white;
background: #555555;
}
.Label {
display: table-cell;
text-align: center;
vertical-align: middle;
font-family: arial;
font-size: 120%;
}
</style>
<!-- Load Javascript files -->
<script src="https://code.jquery.com/jquery-1.12.1.min.js"></script>
<script src="https://beebotte.com/bbt.js"></script>
<!-- Conf. area map -->
<div class="content-wrap">
<div style="width: 400px">
<img src="./confmap.png" alt="topimg">
<!- 会議室A ->
<div id="CR_A" class="Label_OOS" style="top:51px; left:58px;">
<span style="font-size:150%">会議室A</span><br />
<span id="CR_A1"></span><br />
<span id="CR_A2">Out of</span><br />
<span id="CR_A3">service</span>
</div>
<!- 会議室B ->
<div id="CR_B" class="Label_OOS" style="top:51px; left:162px;">
<span style="font-size:150%">会議室B</span><br />
<span id="CR_B1"></span><br />
<span id="CR_B2">Out of</span><br />
<span id="CR_B3">service</span>
</div>
<!- 会議室C ->
<div id="CR_C" class="Label_OOS" style="top:164px; left:58px;">
<span style="font-size:150%">会議室C</span><br />
<span id="CR_C1"></span><br />
<span id="CR_C2">Out of</span><br />
<span id="CR_C3">service</span>
</div>
<!- 会議室D ->
<div id="CR_D" class="Label_OOS" style="top:164px; left:162px;">
<span style="font-size:150%">会議室D</span><br />
<span id="CR_D1"></span><br />
<span id="CR_D2">Out of</span><br />
<span id="CR_D3">service</span>
</div>
</div>
</div>
<script type="text/javascript">
var room = "";
var stat_room = "";
var today = new Date().getTime();
var one_hour = 70 * 60 * 1000; // 70分のシリアル値取得
//Beebotte settings
var Owner = 'kimamadiy';
var Channel = 'RoomStaus';
var Resource = ['CR_A', 'CR_B', 'CR_C', 'CR_D'];
var bclient = new BBT.Connector({keyId: 'XhlXfsNNKIWCDxknw9FG3lPP', secretKey: 'cU02MgPTipuy05d20yJWF2FxJfc3MEzd'});
Resource.forEach(function(room) {
bclient.readPublicResource({
owner: Owner,
channel: Channel,
resource: room,
limit: 1
}, function(err, datas) {
stat_room = datas[0].data;
if(today - datas[0].ts <= one_hour){
(stat_room=="Vacant")?document.getElementById(room).className="Label_Vacant":(stat_room=="IN USE")?document.getElementById(room).className="Label_Use":document.getElementById(room).className="Label_OOS";
$('#'+room+'1').text(stat_room);
$('#'+room+'2').text(Serial2Date(datas[0].ts));
$('#'+room+'3').text(Serial2Time(datas[0].ts));
}
});
});
function Serial2Date(timestamp){
var d = new Date(timestamp);
var year = d.getFullYear();
var month = d.getMonth() + 1;
var day = d.getDate();
return ( year + '/' + month + '/' + day);
}
function Serial2Time(timestamp){
var d = new Date(timestamp);
var hour = ( d.getHours() < 10 ) ? '0' + d.getHours() : d.getHours();
var min = ( d.getMinutes() < 10 ) ? '0' + d.getMinutes() : d.getMinutes();
var sec = ( d.getSeconds() < 10 ) ? '0' + d.getSeconds() : d.getSeconds();
return ( hour + ':' + min + ':' + sec );
}
</script>
</body>
</html>
以上のコードをまずhtml拡張子で保存し、動作確認をしてからaspxに変更し、SharePointのファイルにマップとこのファイルを保管すれば出来上がりです。
5. まとめ
サイボウズガルーン版では、会議室のイメージをクリックするとスケジューラーが開きましたが、Outlookカレンダーに移行してからまだ間も無く研究が必要なので、今回は省略しています。
以上で、BeeBotte版への移植記事は終了となります。
これにより皆さんの業務効率につながれば幸いです。
コメント