google-home-notifierをmDNSで安定化!DHCP環境での「IP変わっちゃう問題」を解決

みなさん、こんにちは。

Google HomeやNestデバイスをNode.jsからサクッと制御できる便利なアプリ「google-home-notifier」。当サイトでも以前、セットアップ方法をご紹介しました。

好きな言葉を喋らせたり、通知を飛ばしたりと、スマートホーム作りには欠かせないツールですよね。

ただ、普通に使っていると、ある日突然「あれ、反応しない……?」となることがあります。その原因の多くは、ルーターの再起動などでデバイスのIPアドレスが変わってしまうことにあります。

今回は、この問題を「mDNS(マルチキャストDNS)」を使って解決する方法をご紹介します!

時間がないよ、というせっかちな方は、私のGitHubリポジトリのREADMEを読んで実際に動かしてみる方が早いかもしれないので、こちらをどうぞ。

 


 

なぜこれまでの方法だと動かなくなるのか?

 

google-home-notifierでデバイスを指定する場合、これまでは主に2つの方法がありました。

方法① IPアドレスで指定

googlehome.ip('192.168.1.20', 'ja');

一番確実そうに見えますが、DHCP(自動でIPを割り当てる仕組み)環境だと、ルーターやデバイスを再起動した際にIPアドレスが変わってしまいます。そのたびにプログラムを書き換えるのは、ちょっと面倒ですよね。

方法② デバイス名(フレンドリー名)で指定

googlehome.device('リビング', 'ja');

実はこの機能、実質的にほとんど動作しません。 Google Homeアプリで見ている名前(「リビング」など)は、プログラム側から取得したり指定したりできないんです。

 


 

解決策は「mDNS名」の活用!

 

そこで登場するのがmDNS(マルチキャストDNS)です。Google Home/NESTデバイスは、ネットワーク内で「自分はここにいるよ!」と自分自身の名前をブロードキャストしています。

mDNS名の場合、

  • 一意である
    Google-Home-Mini-abc123def456 のように、デバイスごとに決まっています。
  • 変わらない
    IPアドレスが変わっても、この名前は変わりません。
  • 自動解決
    プログラムがこの名前を頼りに、現在のIPアドレスを自動で見つけてくれます。

という特徴があるのです。これを使わない手はありません。

 


 

実装と設定方法 – 2段階で確実に設定

 

mDNSは非常に便利なのですが、Google Home アプリやGoogleのアカウント情報から確認することができません。デバイスの裏側に書いてあるMACアドレスとも違う、ネットワーク上の固有IDなんです。そこで、今回は、「今ネットワークにいるデバイスのmDNSを特定する」ステップと「実際に設定して動かす」ステップの2段階で進めます。

ステップ1 – デバイス検出スクリプトでmDNS名を調べる

まずは、自分のGoogle Home/NESTがどんなmDNS名を持っているか確認しましょう。 以下のようなスキャン用スクリプト(find-devices.js)を使います。

var mdns = require('mdns');
var Client = require('castv2-client').Client;

function findDevices(callback) {
  var browser = mdns.createBrowser(mdns.tcp('googlecast'));
  var foundDevices = {};
  
  browser.on('serviceUp', function(service) {
    var ip = service.addresses[0];
    if (foundDevices[ip]) return;
    
    foundDevices[ip] = {
      mdnsName: service.name,
      ip: ip,
      port: service.port
    };
    
    console.log('Found device at ' + ip);
    console.log('mDNS Name: ' + service.name);
  });
  
  browser.start();
  
  setTimeout(function() {
    browser.stop();
    callback(Object.values(foundDevices));
  }, 5000);
}

これをgoogle-home-notifierの実行スクリプトがあるフォルダに保存してnodeで実行すると、ネットワーク内のデバイス一覧が表示されます。 出力例にある「mDNS Name」の部分をメモしておきましょう。

============================================================
Device #1
IP Address:    192.168.1.20
mDNS Name:     Google-Home-Mini-abc123def456
============================================================

ステップ2 – プログラムに設定する

メモしたmDNS名を、google-home-notifierの実行ファイルであるexample.jsの該当部分に貼り付ければOKです!

example.jsの該当部分

// find-devices.jsで見つけたmDNS名をセット
var deviceName = 'Google-Home-Mini-abc123def456'; 

var language = 'ja';
googlehome.device(deviceName, language);

 


 

この方法のメリット

 

この仕組みを取り入れると、google-home-notifierの使い勝手がぐっと向上します。

  1. IPアドレス変更に強い!
    ルーターを買い替えても、停電で再起動しても、名前さえ合っていれば繋がります。
  2. 複数台あっても迷わない
    「キッチン」「寝室」など、複数のデバイスがある環境でも確実に識別できます。
  3. メンテナンスフリー
    一度設定してしまえば、あとは放っておいてもずっと動いてくれます。

 


 

ちょっと技術的なお話

 

なぜ「リビング」のような分かりやすい名前が使えないのかというと、Google Cast APIの仕様上、外部から安定してその名前を取得するのが難しいからなんです。以前はできたのかもしれませんが、私が試してみたところ、今はできませんでした。

一方で、mDNS名はデバイスの通信プロトコルに直結しているため、非常に安定して取得できます。google-home-notifierの内部では、このmDNS名の一部がマッチするかどうかでデバイスを特定しているわけです。

 


 

Google Home/NESTの音声通知を安定させるために

 

今回の修正を反映したコードや、詳しいセットアップ手順(必要なライブラリのインストール方法など)は、私のGitHubリポジトリで公開しています。

ぜひチェックして、安定した通知環境を作ってみてください!

一度設定してしまえば、IPアドレスの悩みから解放されますよ!

 

本日も最後までお読みいただきありがとうございました。

それでは、よいIoTライフを!

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール