こんにちは。
半年以上ぶりの更新となりました。
今回は、スマートホーム向けのさまざまなIoTデバイスを発売しているSwitchbot社の「ボット(指ロボット)」を置き換えた話題です。
通常の利用であれば、わざわざブログに書き起こすこともないくらい単純な置き換え作業です。
ですが私は指ロボットをシングルボードコンピュータ「Raspberry Pi」からコマンドを実行して利用しているため、少し躓くことになりました。
■壊れ・・・てはいない → いや壊れた
置き換えに至った経緯は単純です。経年劣化です。
バッテリーは十分な電圧なのに、指ロボットの指の動きが極めて緩慢になってしまいました。
指の挙動はSwitchbot公式モバイルアプリである程度調整できるのですが、その設定もガン無視されます。
きっとモーターがもうダメなんでしょうね。 約4年ほどで寿命を迎えたようです。
2023/11/15追記:
ついに緩慢な動きさえ出来なくなり、モーターが悲鳴を上げるだけになりました。
分解してみると、モーターから伸びるシャフトを接続する指部品の穴が割れていました。
これではモーターのパワーが指部品に伝わるはずがありません。
強力な接着剤やパテで直したりすることも考えましたが、諦めて廃棄することにしました。
■新規購入そして置き換え・・・あれ?
ちょうどAmazonでSwitchbot社製品がセールとなっていましたが、メルカリで未使用品がもっと安く手に入りました。
先述のとおり私は指ロボットを公式アプリではなくRaspberry Piから実行する環境を構築しています。
指ロボットに対するコマンドラインのうち、Bluetooth MACアドレス部分だけを書き換えれば済む・・・そう思っていました。
ええ、エラーが出て動きません。え〜〜〜・・・・・
■MACアドレスだけじゃなかった
何しろ4年ぶり。当時Raspberry Piから実行できるようになるまでにどんな手順を踏んだかなんて覚えちゃいません。
いろいろ試行錯誤しているうちになんとか動かせるようになりました。
ポイントはコマンドパラメータに与えるハンドル値でした。
Raspberry Pi(Linux)からBluetoothで指ロボットに指示を出すコマンドは以下のとおりです。
# gatttool -i <hci#> -b <BLE MACアドレス> -t random --char-write-req -a <EndGrpハンドル> -n <動作モード>
今回躓いたのは、<EndGrpハンドル>の部分。
<BLE MACアドレス>だけでなく、<EndGrpハンドル>の値を変更する必要がありました。
■手順
いろいろ試行錯誤したのでもしかしたら以下の手順のうち必要ないものもあるかもしれません。
リセットして確認する気もないので、一応やったこと全部書いていきます。
1. Raspberry Piに指ロボットを信頼させる。
# sudo bluetoothctl
[bluetooth]# connect <BLE MACアドレス>
[bluetooth]# trust <BLE MACアドレス>
[bluetooth]# exit
#
2. EndGrpハンドル値を確認する。
# gatttool -i <hci#> -b <BLE MACアドレス> -t random --primary
attr handle = 0x0001, end grp handle = 0x0009 uuid: 00001800-0000-1000-8000-xxxxxxxxxxx
attr handle = 0x000a, end grp handle = 0x000d uuid: 00001801-0000-1000-8000-xxxxxxxxxxx
attr handle = 0x000e, end grp handle = 0x0013 uuid: cba20d00-224d-11e6-9fb8-xxxxxxxxxxx
3. 上述の指ロボットに指示を出すコマンドの可変部分に適用する。
<hci#>
Raspberry Pi側のBluetoothモジュールの識別子です。私の環境では "hci0"と指定しています。
<BLE MACアドレス>
指ロボットのBluetooth MACアドレス。公式モバイルアプリに接続するとアプリから確認できます。
<EndGrpハンドル>
上述の手順で調べたハンドル値です。
<動作モード>
指ロボットの動作をコードで指定します。押す(570100), TurnON(570103), TurnOFF(570104)
■最後に
劣化した旧指ロボットのファームウェアバージョンはv6.3、 新規購入した指ロボットはv6.6でした。
動かなくて困っているうちにこんな相違点を見つけてしまったものですから、もう従来のgatttoolコマンド自体が受け付けられない可能性を勝手に考えてしまい迷走してしまいました。
なにしろ最近のIoT業界はMatterという規格を標準化しようとしています。
きっと新しいファームウェアが当たっている指ロボットは、Matterのお作法に従ったコマンドしか受け付けないのだ・・・そう思い込んでしまいました。
そうではないということに気付いたのはコマンドのエラーメッセージに「Invalid handle」、ハンドル値が不正だよと表示されていたからです。
素直にハンドル値を探れば良かっただけでした。ちゃんとエラーメッセージ見ようぜ私よ。
余談ですが上記のような無駄な苦労することなく、MACアドレスを指定するだけで指ロボットを動かせるPythonスクリプトがネット上に出回っています。(っていうかSwitchbot公式です)
それを使ってもよかったのですが、旧指ロボット購入時に試してパフォーマンスが悪かったので今回も敬遠しました。
.