はじめに
新卒での上京を機に、新築マンションに引っ越しました。エントランスはオートロックで、自宅玄関の鍵は「セサミ4」で自動化しています。(セサミもハックしてラズパイに接続していますが、この話はまた別の機会に!)
今回は、オートロックを遠隔で解除するシステムを構築したので、その仕組みについて解説します。
使用した技術
本システムの構築には、以下の技術を使用しました。
- Flutter(操作用のWebアプリ)
- Raspberry Pi(リレー回路を制御)
- Node-RED(HTTPリクエストに応じてGPIOを制御)
適用条件
本システムが利用できる環境には、以下の条件が必要です。
- 自宅のインターホンがタッチパネル式であること
- リレー回路を用いて「擬似タッチ」を発生させるため
- VPNやSSHを利用し、WANからLAN内に接続可能であること
- ※セキュリティには十分配慮が必要
システム概要
ラズパイ(Raspberry Pi)にリレータッチボード(スイッチサイエンス製)接続し、
MOSFETを介してGPIOで制御できるようにします。
- Node-RED を利用し、HTTPリクエストを受信するとGPIOを0.5秒だけON/OFFするように設定
- Flutterアプリ でUIを作成し、Node-REDにリクエストを送信
- 擬似タッチ により、インターホンの「解錠ボタン」を操作
この構成により、スマホからオートロックを解錠できるようになります。
各工程の詳細
ここでは、それぞれの実装手順について詳しく解説します。
リレー回路の接続方法
本システムではリレータッチボード(ドライバ有り)SSCI-024556を使います。
秋葉原のいくつかの電子部品店においてあります。
スイッチングは3.3V(GPIOそのまま)では反応しなかったため、MOSFET(2N7000)を用いて5Vをスイッチングすることにしました。
リレータッチボードをインターホンの画面の解錠ボタンが表示される位置に両面テープで固定します。導電性のある両面テープを探しましたが、すぐには買えなかったため通常の両面テープと脱落防止のためマスキングテープで雑に固定しました。両面テープ程度の厚さなら反応するようです。
Node-REDのフロー設計
Node-REDは管理がしにくいため、できる限り簡素な作りにとどめる方が無難だと思います。
今回は、リクエストを受け取りGPIOをオンオフするだけにとどめてあります。
Node-Redにはラズパイ向けにGPIO制御の拡張機能がありますがUbuntu 24.04ではうまく動作しなかったため、自作のPythonスクリプトで対応しました。
FlutterでのUI作成
リクエストを送れればなんでも良かったのですが、2年前ぐらいにちょっと触ったのを思い出して採用しました。
ボタンをグリッドに並べただけの簡素な作りです。クリックイベントにリクエストを投げるようにしてます。
システム全体
このような感じになってます。ラズパイには画面をつけたのでタッチで操作できます。
外装は3Dプリンターで作成する予定です。
限界と改善点
現状のシステムには、いくつかの課題があります。
- VPNなしでは外部から操作できない
- 現在はVPN経由でしかアクセスできず、一般的なユーザーには敷居が高い
- Flutterアプリから直接ラズパイにリクエストを送信している
- セキュリティ的に問題があるため、認証認可の仕組みを導入する必要がある
- 操作履歴の記録(誰がいつ解錠したか)も必要
今後の改善策
- 認証認可サーバー を導入し、安全にアクセスできるようにする
- 専用のWeb API を用意し、Flutterアプリから直接ラズパイへアクセスしない構成にする
- これにより、VPNなしでも安全に操作できる環境を構築する
まとめ
このシステムが完成すれば、パートナーや友人が私の不在時でも帰宅できるようになります。
まだまだ改善すべき点は多いですが、開発を加速させていきます!
エピソード(実際に助かった話)
出社初日、私は普段とは違うカバンを持って行ったのですが、鍵を入れ替えるのを忘れてしまいました。
帰りの電車でそのことに気づき、焦りながら帰宅。
「このままではマンションに入れない…!」
そこで、自作システムのことを思い出す。
駅から歩きながらVPNに接続し、スマホでWebアプリを開く。
マンションのオートロックの前で、インターホンを呼び出し、解錠ボタンをタップ。
すると——
「うぃーん…」(自動ドアが開いた)
ぶっつけ本番だったので、本当に動作するか不安だったが、問題なく解錠できた。
心からホッとした瞬間だった。
「もう鍵は忘れないようにしよう…」