スマートホームがスマートじゃなさすぎる
はじめに
みなさんはスマートスピーカーやIoT家電って使ってますか?
私は2018年にスマートリモコンを導入して以来、コンセント、カーテン、カギなどあらゆるIoTガジェットを導入してきました
スマホひとつで操作できたり、スマートスピーカーに話しかけるだけで操作できたり、時間や温度による自動化ができたり便利なことがたくさんある反面、なんでこれができないの?これのどこがスマートやねんしばくぞといった点も多数あります
今回はスマートホームを5年間使い倒した視点からスマートホームの課題とそれを解決するために作ったものについてまとめたいと思います
課題
メーカーやデバイスが無限にある
あらゆるメーカーがあらゆる機器を発売しています
これ自体は喜ばしいことでもありますが、アプリやハブもメーカーごとに必要なためスマホもコンセントもごちゃごちゃです
ひとつのアプリで操作できないとアプリAで電気をつけて、アプリBでコンセントをONにしてといった操作が必要になることもありとてもめんどくさい
Google HomeやAlexaに登録することで発話やシーンに操作をまとめることは可能ですが、毎回しゃべるのも面倒だし、精度も低いし、これらのアプリは絶妙に使いづらい
2022年には標準規格のMatterが定められ、対応するデバイスも増えてきています
この課題はMatterがを解決してくれることを祈っているところです
PCから操作できない
対応しているメーカー、デバイスもありますが
多くのデバイスは専用のスマホアプリからの操作のみに対応しており
PCアプリやブラウザからの操作には対応していません
在宅勤務の機会が増え、デスクでPCを眺めているのにスマホを開かないと操作ができない
ちょっとした不便ですが、少しずつフラストレーションがたまります
ステートやフラグがない
これについては使い始めた当初から不便に思っていたのですが
多くのデバイスでイベントによる機器の操作はできるものの
状態(ステート)に応じたデバイスの操作はできません
具体例を挙げてみると
できること
- GPS等で帰宅したことを検知して電気をONにする
- 気温が一定以下になったらエアコンをONにする
できないこと
- GPS等で帰宅したことを検知して家にいることを覚えておく
- 家にいるかいないかに応じて「気温が一定以下になったらエアコンをONにする」機能をオンオフする
家にいるときだけ、外にいるときだけ、この部屋にいるときだけ、自動でやってほしいことたくさんあると思うのですが、これができるアプリは僕が認識している限りではありません
たとえば現在は、旅行などで長期不在になるときにアプリAで「朝自動で電気が付く機能」をOFFにして、アプリBで「夜間に温度に応じてエアコンをオンオフする機能」をOFFにしてという手間がかかっていますが、
在宅or不在のフラグを一つ導入して機能のオンオフを一括で管理できればとても便利になると思っています
課題の解決方法
課題を解決するために必要な要件を整理してみます
- 利用している各メーカーの機器を操作できる
- Nature Remo
- SwitchBot
- Meross
- スマホからもPCからも利用できる
- サーバー上などで常駐できる
あとはifやwhile、タイマーやステートなど基本的なプログラムならできることができればよいので、上記3つが満たせる言語や環境を検討したいと思います
デバイスのAPI
これがないと始まりません。各社のAPIが存在するか調査します
Nature Remo
公式が公開してくれています
HTTPでGET, POSTしてJSONを取得する方式
HTTPのGET, POSTはほとんどの言語で実現できると思います
SwitchBot
こちらも公式が公開してくれています
同様にHTTPでGET, POSTしてJSONを取得する方式
実現可能性については同上
Meross
これは公式が提供しているAPIは見つかりませんでした
またこちらを参考にHTTP POSTで実現する方法を試しましたが上手くいきませんでした
最終的に採用したのはこちら
Pythonのライブラリとして提供されているものです(MIT License)
MerossのデバイスがPythonからしか操作できないのでAPI部分はPythonを採用します
スマホからもPCからも利用できる常駐アプリ
いわゆるクロスプラットフォームアプリというやつですが、まったく経験がありません
サーバーを立ててブラウザからアクセスする形式でできそうですが、サーバー側なんか全然わからん
サーバー検討
Pythonではhttp.serverをつかってサーバーを立てられるみたいです ただちょっと情報が少なそう
Node.jsだとこんな感じ
GETリクエストで画面に表示する内容や情報を取得したり、
POSTリクエストでデバイスの操作をしたりが一番直感的で簡単にできそうです
というわけでNode.jsとExpressを採用
Node→Pythonを呼ぶ
APIを呼び出す部分はPythonで実現することにしたのでNodeからPythonを呼ぶ必要があります
これは以下を参考に結構簡単にできました
画面をかっこよくしたい
Node.js + Expressでもhtmlを返せるので頑張ればいい感じにできるのだと思いますが、
いかんせんhtmlの知識が全くないので<h1>とか<h2>とかを多用したクソダサページしか作れません
よく分んないけどReactとか使えば勝手にいい感じになるのでは?
という感じで画面表示をする場合はこれを参考にします
本来のフレームワークの使い方とは違う気もしますが、ここらへんまじでよく分ってません
実行環境の検討
サーバーにアプリを常駐させるつもりなので、常に起動しているPCを用意する必要があります
普段使っているPCでもいいですが電気代がスマートではなくなってしまいそうなのでラズパイにしましょう

高っっ
半導体不足の影響でしょうか?値段が2~3倍に跳ね上がっています
しかたないのでファイルサーバーの中にWindowsのVMを構築してその中で実行することにします
ファイルサーバーに使っているのはTrueNAS
VMの立て方はこれ
Windowsが内部で動いているので動作環境に関しては何も気にせずに開発することができます
設計
フルスクラッチでお試ししながら作っているので設計なんか事前には考えていないのですが
最終的にはこんな感じの構成になっています

結果
それぞれ参考にしたサイトのつぎはぎなので特にコードなどは載せませんが完成したものがこちら

- できること
- 各デバイスの一括操作
- 各部屋の温湿度取得
- 屋外の温湿度、天気の取得
- どの部屋に滞在しているかの管理
- これに応じたエアコンなどの操作
- 定時的な状態のチェック、アクション実行
Future work
- NFCタグ読み込みでHTTP POSTするAndroidアプリ
NFC Tools有料版でやりたいことができるか調べてできなければ作る
というか元々はこれがやりたかったんですよね
iOSでは標準のショートカットアプリでNFCタグ読み込み→Googleアシスタントに特定のコマンドを送信を実行可能で
ベッドサイドにスマホを置いたら電気を全部消すといった機能が実現できます
AndoroidではOS標準でこのような機能を持っておらず、やりたければ自分で作るしかないのかな?ってところからサーバーまで立てるようなめんどうなことになってしまった - ラズパイを買ってサーバーをラズパイにする
別に必須ではないですが、ファイルサーバー内に建てたVMなんか不安定そう(本来のファイルサーバー機能にも影響がありそう)なのでできればやりたい - その他機能追加
定時実行では現状特に何もしてません。なにかやりたい
さいごに
とてもスマートになりました
私が
Discussion