obnizのパーツライブラリにしたいパーツありますか?って募集をかけたら、
「PLAYBULB candle」を教えてもらいました。
しかし、教えてもらったものの、デバイスの入手ができないので、@youtoyさんのもってるデバイスを遠隔で開発に使わせてもらいました
リモート開発
obnizはインターネット越しでも遠隔操作できるので、遠隔で開発させてもらうのにお願いしたのはこの項目です。
事前準備
日程調整して当日を迎えるまでの間に、できるだけMTG時間を短縮しようと、ある程度ベースを作っておきました。
PLAYBULB candleのドキュメント / SDK
- https://codelabs.developers.google.com/codelabs/candle-bluetooth#3
- https://github.com/danielsmith-eu/playbulb-live
- https://github.com/Phhere/Playbulb
上記ドキュメントを見つつ、実機がないので、妄想を膨らませながら下記の関数を実装していきます
- isDevice
- getDeviceNameWait
- setColorWait
- setEffectWait
例えば、peripheralが対象デバイスかどうかを判定するisDeviceはこんな感じ。
static _deviceAdvAnalyzerType = new BleAdvBinaryAnalyzer()
.addTarget('flag', [0x02, 0x01, 0x06])
.groupStart('manufacture')
.addTarget('length', [3])
.addTarget('type', [3])
.addTarget('candle_service_uuid', [0x02, 0xff])
.groupEnd();
public static isDevice(peripheral: BleRemotePeripheral): boolean {
const advData = PLAYBULB_candle._deviceAdvAnalyzerType.getAllData(
peripheral.adv_data
);
return advData != null;
}
isDevice以外の関数はすべて接続して行うので、接続チェックをしつつ、numberの配列を書き込むようにします
public setColorWait(r: number, g: number, b: number) {
if (!this._peripheral.connected) {
throw new Error(`Device is not connected`);
}
if (!this._candleColorCharacteristics) {
throw new Error(`no characteristic found`);
}
const data = [0x00, r, g, b];
return this._candleColorCharacteristics.writeWait(data, false);
}
作成途中に PLAYBULB candleの仕様を踏まえたコードを出してくるGithubCopilotさん、流石です。
リモート開発
さて、MTGを繋いでプログラムをデバッグします。
obnizIDを教えてもらって、遠隔でBLEのスキャンをすると、あっさり見つかりました。
接続も無事に成功。
1Stepずつエラーになる場所はないかな、と見ていきましたが、エラーは出るものの微修正の範囲で収まりました。
途中、Webカメラがちらつく!とか、ちょっとカメラ的に光がよくわからない!とかもありましたが、
事前準備したプログラムが8割はそのまま使えたので、微修正だけしてそのままスムーズにデバッグ完了。
なんと30分で終わりました笑
↓30分後に動いている姿。光が見にくいよねということで、デバイスを横向きにしてる
というわけで
@youtoy さんに協力してもらいながら遠隔でobnizの「PLAYBULB candle」のパーツ対応をしました!
(協力ありがとうございました)
コード全体像はまた1月ぐらいにgithubに上げる予定です。