はじめに
ちょっと最近何年ぶりかにobnizに触れる機会があった。気づいてみればOSバージョンは3.xになっていて発売当初に買ったデバイスはアップデートしないとほぼ役に立たない感じになっていた。ただアップデートしてみるとnode.jsで動くわTypeScriptをサポートしてるわで使いやすい環境になっている
無線デバイスも多くサポートされているのでBLE系デバイスを実験するのも悪くなさげ。ということでリハビリがてら2JCIE-BUからデータを取ってみることにした。当然TypeScriptで!
やってみた
まず2JCIE-BUに電源が入っていてデータが飛んでいることが前提。obnizはWiFiにつないでObniz ID表示状態にしておく
以下で開発環境を整えてエディタを開く
mkdir omron_2jcie && cd $_
yarn init
yarn add obniz
yarn add -D typescript ts-node @types/node
yarn run tsc --init
mkdir src
vi src/index.ts
コードは以下。[OBNIZ ID]
はobnizに表示されているIDに読み替える
import Obniz from "obniz";
const OBNIZ_ID = '[OBNIZ ID]';
const obniz = new Obniz(OBNIZ_ID);
obniz.onconnect = async () => {
if (!obniz.ble) return false;
const Device = Obniz.getPartsClass('2JCIE');
await obniz.ble.initWait();
obniz.ble.scan.onfind = (p) => {
if (Device.isDevice(p)) {
const data = Device.getData(p);
if (data) {
if (typeof data === 'object') {
const envs = [];
for (const key in data) envs.push(`${key}: ${data[key]}`);
const ret = envs.join("\n");
console.log(ret);
obniz.display?.clear();
obniz.display?.print(envs[0]);
}
}
}
};
await obniz.ble.scan.startWait();
};
データはJSONで返ってくるので適当にパースしてconsole.log()
で表示した。obniz側では多すぎて見切れるので一番最初の温度のみ表示した
実行する
yarn run ts-node src/index.ts
yarn run v1.22.17
$ /Users/user/work/omron_2jcie/node_modules/.bin/ts-node src/index.ts
temperature: 20.48
relative_humidity: 38.54
light: 230
barometric_pressure: 1013.6
sound_noise: 44.62
etvoc: 843
eco2: 2060
環境データとれた。obniz端末のほうも温度が表示された。
パーツの型まわりが微妙だった件
コード書いてて気になったことが一点。Obniz.getPartsClass()
で取得した2JCIEクラスインスタンスの型付がどうしてもうまくいかなかかった
const Device = Obniz.getPartsClass('2JCIE');
Deviceはany
となるので以降のコード補完がなくて不便。パーツのソースコードを見る限りOMRON_2JCIE
でいいのかもと
const Device: OMRON_2JCIE = Obniz.getPartsClass('2JCIE');
としてみたがダメだった。定義されてないか。どうやるのが正しいんだろ?わかるひといらっしゃったら教えてください
どうやったらいいんだろとちょっと探してgetPartsClass()の中身を見てみたら固定でany
を返すようになっていた。これはパーツの型を返すようにしてほしいなあ
おわりに
発売当初はサイロ感が強くてあまりいい印象を持てなかったobnizだけどなんか自由感が増して楽しくなった感があります。TSまわりもだんだん強化されていくことを期待してちょいちょい使ってみたいと思いました^^