$ enl set 192.0.2.10 026301 open_close_operation close

これを打つと、リビングの電動シャッターがウィーンと降りてきます。リモコンには触れていません。1行のコマンドが、家の中の物理的なモノを動かす。

おもしろいのは、これがクラウドを一切経由していないことです。宅内LANにUDPを1発投げているだけ。しかも相手は特別なスマート機器ではなく、家に最初から付いている電動シャッターです。いったんこの状態を作ってしまえば、あとは cron で回すのも、AIに直接叩かせるのも、同じ1コマンドの延長でしかありません。

前回の記事「Home Assistantをやめて、家のOSを自作しはじめた」で、家を動かすためのツール群(enl / mat / ais / casa / mando)を紹介しました。今回はその第1弾、enl の話です。enl は、ECHONET Lite という仕組みを扱うために僕がつくって公開しているツールです。

なぜ、コマンド1つでシャッターが動くのか。答えは、シャッター側が最初からこの ECHONET Lite という共通の仕組みでしゃべれるように作られているからです。順番に見ていきます。

ECHONET Liteとは

一言でいうと、日本の住まいの設備や家電が共通で使う通信の仕組みです。

エアコン、給湯器(エコキュート)、電動シャッター、電力を測るスマートメーター——メーカーもカテゴリもばらばらな機器が、同じ仕組みの上で「いまの状態」を教えてくれたり、「こう動いて」という指示を受け取ったりします。

ポイントは、メーカーをまたいで同じやり方で扱えることです。前回書いた「特定のメーカーに縛られないスマートホームがやりたい」という思いと、ここでつながります。ECHONET Liteは日本発の規格ですが、国際的にも標準化されていて、一部の変わったローカルルールというより「日本の住まいの設備が広く採用している共通語」という位置づけです。

通信の細かい中身まで踏み込むと長くなるので、今回は触れません。「共通の言葉でやりとりしている」と押さえておけば、この先は十分です。

Matterとの関係

スマート家電まわりでは、最近「Matter(マター)」という言葉も聞くようになりました。ECHONET Liteと何が違うのか、軽く整理しておきます(Matterを知らなくても、この先は問題なく読めます)。

ざっくりした棲み分けはこうです。

  • Matter — ここ数年で広がってきた世界共通の規格。照明やプラグなど、新しく売り出されるスマート機器の側で採用が進んでいます
  • ECHONET Lite — 日本の据え付け設備や家電の側で広く使われている規格。エアコン・給湯器・シャッターなど、家に最初から組み込まれているものに多いです

僕は、この2つを別々のツールとして作っています。enl(ECHONET Lite用)と mat(Matter用)です。理由は単純で、家の中に両方の規格が現に混在しているからです。

新しく買ったスマートプラグはMatterでしゃべり、備え付けの電動シャッターはECHONET Liteでしゃべる。どちらか一方に統一されるのを待つより、両方を素直に扱える道具を持っておくほうが早い——そう考えて、規格ごとに道具を分けています。

対応機器の見つけ方

ここまで読んで、「うちにもそんな機器あったかな」と思った方は、たぶん正解です。

見分け方は、カタログや取扱説明書の表記です。「ECHONET Lite対応」「HEMS対応」と書かれていたら、それがサインです。特に多いのは、電動シャッター、エアコン、エコキュート、分電盤まわりの機器。新築で家を建てた場合、スマートメーターまわりに標準で載っているケースも珍しくありません。

うちの電動シャッターは、まさにこれを狙って選びました。最初から「シャッターを無線で開け閉めしたい」と思っていたので、ECHONET Liteで操作できることを確認したうえで導入したんです。おかげで、家が最初から「操作できる状態」で立ち上がりました。

enl で家に聞いてみる

ここからは、実際に動かしてみます。使うのは enl。ECHONET Lite専用に、僕がRustで書いてGitHubで公開しているCLIです。デーモンは立てません。ソケットを開いて、送って、タイムアウトまで待って、終了する——それだけのone-shotなツールです。やることは「探す → 調べる → 動かす」の3ステップだけ(以下、機器のアドレスはドキュメント用の 192.0.2.x にしています)。

まず、宅内LANにどんな機器がいるかを探します。

$ enl discover
{
  "devices": [
    {
      "ip": "192.0.2.10",
      "count": 1,
      "instances": ["026301"]
    }
  ]
}

discover は、ローカルの /24 への unicast sweep と multicast を併用して応答を集めます。192.0.2.10 に機器が1つ見つかりました。

026301EOJ と呼ばれる機器の識別子です。前半の 0263 がクラス(=電動シャッター)、末尾の 01 がそのインスタンス番号。つまり「1台目の電動シャッター」を指しています。

見つかっただけでは何ができるかわからないので、次は describeプロパティマップ——その機器が何を読めて(get)、何を書けて(set)、何を通知してくる(inf)のか——を引きます。

$ enl describe 192.0.2.10 026301
{
  "set_map": [
    {
      "epc": "E0",
      "name": "open_close_operation",
      "values": { "41": "open", "42": "close", "43": "stop" }
    }
  ]
}

(実際の出力はもう少し項目が多いですが、ここでは要点だけ抜き出しています)

open_close_operation(開け閉めの操作)に値を書き込めて、open(開ける)・close(閉じる)・stop(途中で止める)が指定できる。これで、冒頭のコマンドの意味がつながります。

$ enl set 192.0.2.10 026301 open_close_operation close
{
  "ip": "192.0.2.10",
  "eoj": "026301",
  "esv": "SetRes",
  "result": "accepted",
  "properties": [
    { "epc": "E0", "name": "open_close_operation" }
  ]
}

"result": "accepted"(受け付けました)が返ってきて、実際にシャッターが降ります。念のため、いまの開閉状態も読んでおきます。

$ enl get 192.0.2.10 026301 open_close_state

探す(discover)→ 調べる(describe)→ 動かす(set)の3ステップで、機器を見つけてから操作するまでが完結しました。

なぜ、この作りにしたのか

ここが enl の肝なので、少しだけ設計の話をさせてください。

stateless / one-shot。 enl は常駐しません。ソケットを開いて、送って、タイムアウトまで待って、終了する。状態を抱え込まないので、「いまの状態」を知りたければ、その場で家に聞けばいい。前回書いたとおり、家の状態は家自身が持っているからです。状態を持たない道具は、壊れようがありません。

stdoutは純粋なJSONだけ。 ログも進捗も装飾も混ぜません。診断ログ(tracing)とエラーは、すべてstderrに逃がしてあります。だから、そのまま jq に流せます。

# シャッターが開いていたら閉める
$ enl get 192.0.2.10 026301 open_close_state \
    | jq -e '.properties[0].value.state == "fully_open"' >/dev/null \
  && enl set 192.0.2.10 026301 open_close_operation close

exit codeで分岐できる。 成功は 0、タイムアウトは 3、機器がリジェクト(SNA)したら 4cron や n8n から回したときに、「応答がない」のと「拒否された」のを区別できます。これは Home Assistant を使っていて一番つらかった、何が起きているのか分からないの裏返しです。

AIがそのまま叩ける。 出力が構造化JSONで、しかも enl schema get で各サブコマンドの JSON Schema を返せるので、LLMのfunction callingにそのまま食わせられます。統合ソフトのGUIを介さず、AIが直接家を操作できる——これが、自作に踏み切った一番の動機でした。

1つ実務上の注意を。同じマシンで Home Assistant のようなECHONET Lite対応の統合ソフトが動いていると、UDP 3610 を先に握られて応答を横取りされます。enl を試すときは、そちらを止めておいてください。

ここで見せた3つ以外にも、状態変化の通知を待ち受ける listen、任意のESV/EPCを生で投げる raw などがあります。詳しくはリポジトリを見てください。

おわりに

コマンド1つでシャッターが降りたとき、正直、感動しました。ずっと憧れていた「コンピュータから、現実の物理的なモノを動かす」が、目の前で起きたからです。前回の記事で書いた原体験——画面の中の操作が、現実のモノをぱちっと動かす——を、自分の手で再現できた瞬間でした。

そしてもう一つ大きいのは、こういうことが今は個人でも手が届くようになった、ということです。道具をゼロから作るのは、少し前まで時間的にも難易度的にもかなり大変でした。それがAIのおかげで、ぐっと現実的になった。この身軽さも、いま家づくりを面白くしている大きな理由です。

enl は、ECHONET Lite側の入り口にすぎません。次は mat(Matter側)や、それらをまとめる casa の中身も、同じように手を動かしながら書いていきます。自分の家がしゃべる言葉を少しずつ覚えていく記録として、また覗きに来てもらえたらうれしいです。