Tsuzu's Notes

主にIT系備忘録

Node.JSでアンプをLAN経由で操作

以前家の今のテレビを父が購入した際、なぜか導入されたMarantz NR1604。(今や家で使う人は私一人のみでとてももったいない。)
NR1604はDLNAやネットワークラジオ、AirPlay*1などの機能をサポートしており、その一環としてLAN経由で操作ができるようになっている。
f:id:tsuyochi23182:20160709181127p:plain:w400

このNR1604は、音質などに疎い私には十分満足のいくものであり、よく家に一人でいる時にAirPlayを利用して音楽を流している。
NR1604は電源が切れている状態でもLANには接続されており、AirPlayで再生を開始すると自動的に電源が入るようになっている。
しかし、AirPlayが終了した後でも自動で電源が切れる機能はないため、私はよく電源を切り忘れてしまう。アンプは非常に熱を持つためよろしくない。

そこでタイマーをセットして指定された時間になるとLAN経由で電源を落とすスクリプトを軽く組んでみた。以下、開発環境。

まず、LAN上に存在するNR1604のIPアドレスを取得するところから始めた。プログラム内にIPアドレスを直で書いてもよかったが、度々変動していることもあったので動的に取得させることにした。
LAN上のデバイスのIPアドレスを取得する方法として、DLNAでよく使われているUPnPなどがあるが、今回はAppleが開発したBonjourを用いた。(そもそもUPnPをNR1604をサポートしているかは不明)
Node.JSにはBonjourを利用するなんとマルチプラットフォームなライブラリを公開してくれている人がいたため、開発はスムーズに行うことができた。Node.JSなんでもライブラリあってすごい!本当に。
Bonjourを利用して、サービスの種類をAirPlay(raop.tcp)にしてやると、以下のようにデバイスの情報が取得でき、その中にIPアドレスも書いてある。
f:id:tsuyochi23182:20160709183705p:plain:w400

あとは指定の時間にCronJobが発火するようにセットし、このIPアドレスに対してHTTPリクエストを送信するだけで電源を切ることができた。
今更ながらリクエストを送るために今回は既存をライブラリを用いたがそのライブラリが古いものであったため、バグ修正に追われて自分で書いた方が圧倒的に楽だったのが残念。
(一応コードを貼り付けますが基本的にmarantz-avrがおかしいのでまともに動きません。)
これで気兼ねなくMarantzアンプを使えるようになったので満足。

Marantz NR1604 Auto PowerOff

*1:Appleが開発した、iOS/macOSなどでサポートされているLAN経由で音声、ビデオなどを転送する機能。