賃貸暮らしでいつも煩わしく思うのが集合玄関。
スマートロックを導入しても自室しか開けられないから、結局鍵を持ち歩かなきゃいけないし、
宅配ボックスがない場合や大きい荷物の場合、配達員が屋内に置き配できない。
セキュリティ?集合玄関ごときで防犯性高まると思ってるならちゃんちゃらおかしいっすよ。
ということで、個人的に百害あって一利なしと思ってる集合玄関の無効化を試みた。
ちなみに、この試みは半年以上前の話で、結果を先に話すと実用まで持っていけなかった。
よって、今も依然として集合玄関に悩まされている。
仕様策定
まず、モニターの型番を調べて仕様書と実際の配線を確認してみた。
残念ながら、信号線をハックして自室が呼び出されていることを識別したり、開錠信号を送ることは無理そう。
アプローチを変えて、呼び出し時のLEDに照度センサーをつけて識別し、"OPEN"ボタンを物理的に押す作戦に。
手元にあったM5StickとSwitchBot Botが使えそうだ。
実装
ハードウェア
賃貸なので、すぐ現状復帰できるよう、モニターの凹凸を利用してパチっと嵌め込むエンクロージャを設計。
ソフトウェア
SwitchBot BotはBLEのAPIが公開されているので、M5Stickをセントラルにして、Botのアドバタイズをスキャンし、発見できたらスイッチ動作を命令すれば良さそう。
/**
* @brief Execute Bot using BLE.
*/
void executeBot()
{
NimBLEDevice::init("elc");
NimBLEClient *pClient = NimBLEDevice::createClient();
if (pClient->connect(NimBLEAddress(SWITCHBOT_BLE_MAC, BLE_ADDR_RANDOM)))
{
log(ESP_LOG_INFO, "Connected to Bot");
NimBLERemoteService *pRemoteService = pClient->getService(BOT_SERVICE_UUID);
if (pRemoteService)
{
NimBLERemoteCharacteristic *pRemoteCharacteristic = pRemoteService->getCharacteristic(BOT_CHARACTERISTIC_UUID);
if (pRemoteCharacteristic)
{
pRemoteCharacteristic->writeValue(BOT_COMMAND, sizeof(BOT_COMMAND), false);
log(ESP_LOG_INFO, "Command Sent to Bot!");
}
}
else
{
log(ESP_LOG_ERROR, "Failed to execute Bot");
}
NimBLEDevice::deinit(true);
}
}
あとは照度センサーの明滅感知ロジックやディスプレイ表示機能を組み合わせて実装完了。
検証
Botの反発力や位置を調整したりする必要はあったけど、割と簡単に動くものが作れた。
着想から1週間ぐらい。
ただし、M5Stick内蔵の80mAhの電池では4時間が限界。
CPU周波数を落としたり、ADCを極限まで効率化したり、ディスプレイの輝度を下げたり、とにかく思いつく限りの省エネ化を頑張ったけど、4時間。
(何も工夫しなかったら2時間未満だったので、だいぶ頑張ったと思う)
これでは、外出して帰ってくる頃には電池が切れてて閉め出されてしまうので、結局、鍵を持ち歩かなければならない。
USBで給電し続ける方法もあるけど、モニターの近くにコンセントがなく、モバイルバッテリーで延命させる手間を考えたら、さすがに馬鹿らしい。
まとめ
非常に悔しい結果に終わった。
だいたいこの手の製作、ネットワークか電源でハマる。
電気があればなんでもできる、電気がないと何にもできない!
BotはWiFi越しに外からも動作させられるので、LEDの明滅とか感知せず、普通にスマホから集合玄関を開けることは可能。
ただ、それもBotの電池切れとか考えると鍵を持ち歩く必要はあるんだろうなぁ。
まぁ、最悪、誰かの後ろにくっついて入ればいいんだけど。

