IIJさんのMachinistなるものを知ったので、obnizで使ってみました
そしてついでにMachinis javascript sdkなるものを勝手に作ってます
Machinistとは
Machinistはいわゆるデータ保存サービスです
クラウド上にデータを保存します。
データと言っても、動画からテキストまでいろいろありますが、Machinistは数値データに特化しています。「センサーデータ、ビジネスの KPI」とHPトップに書いてある通り、数字データが簡単に扱えるようになっています。IoT向けですね。
データ保存後はグラフ化したり、条件によってアラームメールを飛ばしたりできるようです
類似サービスだとambientですね
obnizとは
IoT系はだいたいC言語を描かなきゃいけないことが多いですが、JavaScriptやpythonなどの言語でIoTをすることができます。
今回はこれとMachinistを組み合わせてみました。
温度をとって上げてみる
Machinist/obnizの準備
それぞれ公式を見ながら会員登録等をします
- Machinist 1. アカウントの登録
- obniz クイックスタート
Machinistのデータ構造を理解する
MachinistにはAgentやmetricという概念?が出てきます。
Agentが何かと言うと、送信元デバイスのようです。
metricやnamespaceも出てきて、こんがらがるんですが、全体構成としてはこの様になってそうでした
Machinist クラウド
L Agent
| L Namespace
| | L Metric
| | | L data
| | | L data
| | |
| | L Metric
| | L data
| | L data
| |
| L Namespace
| .
| .
L Agent
.
.
.
Metricにデータが入って、それをまとめるNamespaceがあって、さらにそれをまとめるAgentがあります
データ構成イメージはこうなっていますが、クラウド上では横断的にフィルタリングや検索ができるので、どういう構成が良いかは結構悩みそうです。
(たとえば、Agentをまたいで同じMetric名でフィルタリング等ができます)
ただ、ここで混乱したのが、データ構造がこうなっていても、API上は一つのmetricに複数データを入れて更新できないAPIになっています。
API上だけで行くと、複数データを更新したい場合は、2つmetricを作る・・という不思議な構成でした。
Machinistにデータを送ってみる
MachinistのGetting Startedを見てるとCurlでデータを送信しています。Curlとか触るのが嫌だったので、javascriptでラッピングしました
API_KEYは各自のものに書き換えてください。
Machinistログイン→プロフィールから取得できます
//初期化
const machinist = new Machinist('Home', 'API_KEY');
//データを追加
let random = Math.floor(Math.random() * 10 + 20);
machinist.addMetric('temperature', random, {
namespace: 'Environment Sensor',
});
console.log(`data : ${random}`);
//データを送信
machinist
.post()
.then(res => res.json())
.then(json => {
console.log(json);
});
まず、new Machinist('Home', 'API_KEY');
でMachinistオブジェクトを作っています。
Home
がAgentの名前で、API_KEY
はMachinistのwebサイトから取得するAPIキーです
そのHome(Agent)にtemperature
というMetricを追加しています。
namespaceをEnvironment Sensor
にしていますが、省略するとDefault
になるようです。
Machinist クラウド
L Home(Agent)
L Environment Sensor(Namespace)
L temperature (Metric)
L data
L data
これでWeb上からデータを見るとポツンと追加されています
obnizで温度を取って入れてみる
SHT31というセンサを使っています
温湿度がデジタルで取得できる便利なセンサーです
API_KEY
とOBNIZ_ID_HERE
をそれぞれ書き換えてください
const machinist = new Machinist('Obniz', 'API_KEY');
const obniz = new Obniz('OBNIZ_ID_HERE');
obniz.onconnect = async () => {
let sensor = obniz.wired('SHT31', {
vcc: 0,
sda: 1,
scl: 2,
adr: 3,
gnd: 4,
addressmode: 5,
});
while (1) {
let temp = await sensor.getTempWait();
let humd = await sensor.getHumdWait();
console.log('temperature:' + temp + ' humidity:' + humd);
machinist.addMetric('temperature', temp, {
namespace: 'SHT31',
});
machinist.addMetric('humidity', humd, {
namespace: 'SHT31',
});
machinist
.post()
.then(res => res.json())
.then(json => {
console.log(json);
});
await obniz.wait(60000);
}
};
今回は温度と湿度があったので、構成はこちらのようにしています。
Machinist クラウド
L Obniz(Agent)
L SHT31(Namespace)
L temperature (Metric)
L data
L data
L humidity (Metric)
L data
L data
こんなふうにデータが取れました!
カスタムチャートを使ってグラフを重ねています。
途中で困ったこと
1秒おきにデータを取ってみたら、うまく反映されませんでした。
なぜかな・・・とずっと悩んでいたらSDKの中にこんな記述がありました
これ、以下の条件のときは上書きされるようです
- 同じAgentName
- 同じNamespace
- 同じMetricName
- 同じ時刻(1分未満切り捨て?)
つまり、1分よりも短い間隔の場合はデータをとっても保存されません。(前のデータが消えます)
Machinistはロングスパンで使うを想定しているようですね
まとめ
MachinistはMetricとかAgentとかの概念理解がすこし躓くかも知れませんが、そこを乗り越えれば簡単に可視化できて楽しそうです