
家庭内SNSを作る
みなさんはTwitter(自称X)が爆死したときの避難先を決めていますか?私はmixi2です。なんか軽いから。
しかし現在はコーディングAIが発達しており…SNSの一つくらいは自動で出来るんじゃないですか?そう思ったので、Claude Codeくんに頼んでRaspberry Pi上で動作する自分だけのSNSを作ってもらうことにしました。名前は安直にHomeSNSです。
LAN内からのみ使用できる家庭内SNSのようなものをRaspberry Pi 4上で動作させたいので、設計案を考えて。Nginx、Python、SQLite等はインストール済み。アカウントのパスワード管理のようなものはなく、どの端末も任意のアカウントを名乗って書き込める。アカウントはアカウント名とアイコン画像を持つ。投稿は投稿日時、200文字までの文字列、1枚までの画像、返信先の投稿idを持つことができる。

添付画像はこのあと4枚に増やしました。しかし、人口1人のこの家でHomeSNSには誰が参加するのでしょうか…?
Webブラウザから参加する

そういうわけで、アカウントを機器ごとに分けてみることにしました。MacBook、iPhone、Fireタブレット…Webブラウザが動く機器からなら投稿することができます。これで日常のメモ的用途に使用していこうかと考えていました。
Twilog的に使用する
Twilogというサービスでは、Twitterの自分のツイートを自動収集しアーカイブ的に使用できます。今回作ったHomeSNSにも、同じような自動投稿システムを作って自分の投稿をコピーするようにしています。
ESP32から参加する
なにしろ自分しか投稿しない前提で作った家庭内SNSなので、認証もないしAPIも制限なし。ソースコードもあるので、Claude Codeくんに見せればESP32デバイスから投稿するようなプログラムはすぐに作ってくれます。
で、以前作ったM5Stack GPSロガー、あれは家のWiFiに接続することで帰宅を判別することができます。ということは、「電源を入れた直後にWiFiに接続できた」=車庫でエンジンがかかった、「GPSログを記録中にWiFIに接続できた」=帰宅した、という状態を感知して投稿することができるはずです。

こうなると機械だけが投稿しているSNSみたいになってきて、見た目が面白いので以降は機械の参加者を増やす方向になりました。
iPhoneの通知から参加する
機械が投稿するSNS、となると参加してほしいのがSwitchBotですが、SwitchBotからの通知を直接受け取るにはWebhookを使う必要がありそうです。ローカルでやれそうな方法を考えて、スマートウォッチなどが実装しているiPhoneに来た通知をBluetoothで受信できる機能を利用してみることにしました。
NimBLE-ArduinoというのがClaudeくんが見つけてきたライブラリです。これを使って、家の中で常に起動しているESP32デバイスに橋渡し役をやってもらいます。

で、この反射式液晶ESP32デバイスを使用しています。このデバイスは反射式液晶のため、時計を表示させて1秒ごとに画面更新しても2日くらいはバッテリーで動きます。天気予報やToDoも表示させつつ、iPhoneの通知も表示して、同時にHomeSNSにもその内容を投稿すればいいわけです。

アプリ名でフィルタリングしてSwitchBotからの通知だけを投稿するようにしています。これでドアが開いたり夜に自動消灯したりの通知も投稿されるようになりました。
ブザー音で参加する
で、石磨き会に行ったところ、WiFiに接続できない家電でもブザー音を感知すれば投稿できるのでは?という話になりました。家の中に転がっているESP32デバイスでマイクを内蔵しているものを探して…
M5Capsuleを使ってみることにしました。
M5Capsuleで家電のブザー音を識別するPlatformIO+Arduinoプロジェクトを作りたい。まずは空のプロジェクトを作り、使えそうなライブラリを提案して。
シリアルモニタでログを見るのは大変なので、下記の仕様でSDカードにログを出すようにできる?
・一定以上の音量で記録開始、音の間隔が1秒未満の場合連続したログにする
・音のピーク周波数を16段階に分け、0-Fの16進数で記録する。
・上記の16進数で0.1秒ごとのログを記録する。無音はスペース。「222 EEE」であれば、0.3秒間16進数で2の周波数の音を感知し、0.1秒無音、次の0.3秒Eの周波数を感知したことを示す。
・上記のログを単一のテキストファイルに記録する。1秒以上の無音を挟んだ場合次の行に記録する。
(実際にはこのあと0.05秒を単位にしています)
原理的には単純です。M5Capsuleのマイクから入力された音を、指定した周波数でサンプリングして高速フーリエ変換すると、周波数スペクトルが取得できます。時間を区切ってこれを繰り返し、一番音が強い周波数を記録していきます。家電のブザー音はたいてい、特定の高さの音の規則的な繰り返しなので、そのパターンを記録して比較することで判別できるでしょう。
パターンは周波数を16段階に区切って16進数で表し、0.05秒ごとに記録するようにしました。ノイズフロアを測定し、無音はスペースで表します。
電子レンジが温め終了した時のブザー:
33333333 33333333 33333333 33333333 33333333
冷蔵庫の扉が開けっぱなしの時のブザー:
BBBBBBBB BBBBBBBB BBBBBBBB BBBBBBBB BBBBBBBB
洗濯機の洗剤が少なくなってきた時のブザー:
44444444 444444 4444444444
あとはこれをSDカードに書いておき、M5Capsuleは聴いた音からパターン文字列を生成して、編集距離などで一定以上類似していたらHomeSNSに投稿します。

M5Capsuleは知らない音がしたらパターン文字列をSDカードに記録するようにしています。こうして生活しながら一種類ずつブザー音を登録していくわけです。プロジェクト・ヘイル・メアリーでグレース博士がやっていた方法と同じです(あっちは和音があるのでピーク周波数だけではない分複雑です)
M5Paperで見る
ESP32で投稿できるなら表示もできます。この前作った家庭内スマホ風M5Paperにもクライアントを実装して、HomeSNSを眺められるようにしましょう。

アイコン画像は表示ちょっと重いかなと思ってアカウント名の先頭文字にしていますが、割と判別しやすいですね。
未来へ…

こうしてHomeSNSには、一人の人間が生活しているだけで車や家電が自動的に投稿し、生活ログが記録されていくようになりました。IoT(Internet of Things)ならぬSoT(SNS of Things)ができたわけです。
将来的には家電の投稿内容に反応して他の家電がアクションを起こすとかしたら面白いかもしれないし…今の時点でも高齢者の見守りサービスってこういう感じで出来るな…という感じではあります。なんというか、我々人間がSNSの表示形式に慣れすぎたおかげで家電の動作ログもSNS風に表示すると分かりやすいってことかも…