IoTというとエッジデバイスでデータを集計してメッセージブローカーやIoTプラットフォームでうんぬんとかいうのを想像しますが、今回はそういうのを使わずにIoT的なことをしたいと思いました。
ちょうど下記のような記事を見つけまして。
コンテンツ・アドレッサブルで多バージョン分散データベースNomsのAttic Labsが$8.1Mを調達
NomsというのはGitにアイデアを得た分散DBということらしいのですが、じゃあ逆にGitでIoT的なことができるのか?ということで、普段使っている、GitだけでIoT的なことをやってみました!これぞサーバレスアーキテクチャですね。(嘘)
ここからGitの機能で、MacのLoad Averageを定期的にデータを取得し、Webブラウザでチャートを表示する過程を書いています。ネタですので時間を無駄にしたくない人は気をつけましょう!
IoTのThings側
デバイス側はgitが使える、パワフルな環境じゃないといけません。とりあえずMacで、Load Average取ります。localで定期的にcommitするソースコードは以下です。
var child_process = require('child_process');
var fs = require('fs');
getUptimeLoop();
function getUptimeLoop() {
getUptime(function(data) {
fs.appendFileSync('data.txt', data[0] + "," + data[1] + "," + data[2] + "\n");
git_cmd();
setTimeout(getUptimeLoop, 10000);
});
}
function getUptime(cb) {
var exec = require('child_process').exec;
var child = exec('uptime', function (error, stdout, stderr) {
var index = stdout.indexOf('load averages:');
var str = stdout.substr(index+15);
var las = str.split(' ');
cb([Number(las[0]), Number(las[1]), Number(las[2])]);
});
}
function git_cmd(cb) {
child_process.execSync('git add data.txt');
child_process.execSync('git commit -m "Added data"');
}
data.txtにLoad Averageの値をappendしていきます。それを定期的にgit add .
、git commit
します。
動かす前にgit init
しておきます。
実際に動かすとこんな感じです。
Internetへ!
できました。リモートにpushします。今回はGithubで。
remoteリポジトリを追加します。
git remote add origin git@github.com:syuhei176/git-iot.git
git push
は1日に一回くらいの想定です。今回は手動で。gh-pagesブランチにpushします。
git push origin gh-pages
pushされました。
data.txtのhistoryがぎっしり。
データを可視化
gh-pagesブランチにpushしているのでGithubページが使えます。htmlとjsを書けば、貯めたデータをブラウザでチャート化できます。
出来上がったチャートのURLはこちら:https://syuhei176.github.io/git-iot/
まとめ
なんとIoTプラットフォームもメッセージブローカーも何も使わずに、デバイスからデータを取ってWebで可視化できました。今回は完全にネタですので。はい、どうもすみません!
注) Githubに迷惑をかけないようにしましょう