NetflixだのYoutubeだののこの時代に、未だにPCでテレビ番組の録画を続けています。魚住惇です。
録画サーバーとして動かしている自作PCをリビングのテレビ台付近に置き、そこをもうすぐ2歳になる息子が入らないようにケージで囲っていました。 しかしそのケージ内に見事侵入に成功した息子は、何故かOAタップの録画マシンの電源が挿してある部分のスイッチのみをオフにするという芸当を披露しました。
なんでそこだけ。
息子がケージ内に侵入したのは午前中、僕が気づいたのはその日の夜のことでした。つまり妻のゆかさんなら、ケージへの侵入は止められなくても、電源を再び入れることは可能なはず。
というわけで、録画用に使っている自作PCの電源が落ちている時だけ、何らかの方法でゆかさんに状況を伝えるためのシステムが必要となったのです。
そこで今回挑戦してみたのが、RaspberryPiとAlexaを組み合わせた仕組みづくりでした。
今回使ったもの
今回の仕組みづくりのために用意するものは、RaspberryPiというシングルボードコンピュータと、Alexaです。
欲を言うとRaspberryPiの最新版は4なんですけど、我が家にあるのがZeroという初代RaspberryPiの性能でフリスクサイズまで小型化されたものだったので、今回はそれを流用しました。
ガジェット好きとして、興味がそそられるかどうかは別として、「シングルボードコンピュータって、なんの意味があるの?仮想マシンで良くない?」というのが僕のこれまでの持論でした。
でも今回の仕組みづくりは、対象のPCの電源が落ちてしまった場合のセーフティーネット作りです。そのPC内で仮想マシンを作ってしまっては、肝心な時に役に立たないわけです。
しかもRaspberryPiはUSB電源で動いてくれる優れもの。しかもデフォルトだとファンレスです。僕自身、今回の仕組みが必要だと思った時に、「あー、こういう時にラズパイって必要になるんか」と実感しました。
ちなみに、ラズパイ本体のGPIO端子にスピーカーを直接付けても良かったんですけど、調べてみるとビープ音を鳴らすだけでも抵抗やらトランジスタやらが必要そうだったので、ラズパイ本体から鳴らすのは断念しました。
僕が持っているラズパイがZeroじゃなくて普通サイズのものだったら、イヤホン端子がついているから楽なんですけどね。
じゃあ他に何か使えるスピーカーはないのかと考えた結果、Alexaと連携してAlexaにしゃべってもらう仕組みを作った方が面白そうなんじゃないかと考えたわけです。
ただこのRaspberryPiとAlexaを繋げて喋ってもらうっていうのが、今回の最大の難関でした。
Raspberry PiとAlexaを連携して喋らせる
本当なら接続方法などを全てまとめると親切なんだと思いますが、ちょっと長すぎる道のりだったのでざっくり書きます。
手順としてはこんな感じ
- RaspberryPiにNode-REDをインストール
- Node-REDでnode-red-contrib-alexa-remote2v2をインストール
- node-red-contrib-alexa-remote2v2のalexa-cookie.jsとproxy.jsをAmazon.co.jp仕様に修正
- Alexaとの連携作業
この流れでの作業が必要でした。
作業1 RaspberryPiにNode-REDをインストールする
一応、Raspberry Piを最新の状態にしておきました。
$sudo apt update $sudo apt full-upgrade $sudo apt clean
aptからインストールする方法もあるらしいですが、今回はこちらの方法でインストールしました。
$bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
作業2 Node-REDでnode-red-contrib-alexa-remote2v2をインストール
このNode-REDというアプリは、ブラウザベースでNode.jsをブロックを繋ぎながらスクリプトを組み立てられるものです。 これに、Alexa操作系のブロックを追加します。
今回インストールしたものは、「node-red-contrib-alexa-remote2v2」です。v2がついていないものも検索すると出てきますが、そっちだとうまく動きませんでした。v2という別配信の最新バージョンを使うことで、今回は動作できました。
Amazon.co.jp仕様に修正
特に苦労したのがここからの作業でした。
このNode-REDとAlexaを連携させるための記事をQiitaなどで漁っていたのですが、どれも2020年頃に書かれたものでした。それ以前だと「node-red-contrib-alexa-remote2」のままでも使えたらしいんですが、2020年ごろからAmazonの仕様が変わって、それに合わせてjsのコードを書き換える必要が出てきたと書かれていました。
ただその記事も2020年、つまり記事執筆時点では1年前の記事です。僕がラズパイとAlexaの連携をやろうと思ったのが遅かったのか、最近書かれた記事が見つかりませんでした。ので、ここからはちょっと試行錯誤しました。
結果、「node-red-contrib-alexa-remote2v2」に、参考にさせていただいた修正内容が施されたalexa-cookie.jsとproxy.jsをGitHubから拝借することで無事動かせました。
Alexaとの連携作業
あとは簡単です。ここに書いてある通りに日本のAmazonのURLなどを設定するだけで、無事連携することできました。
Pingが通らなかったらAlexaの音声でお知らせ
ま、いっか。プライベートIPくらい。
今回組んだ仕組みは画像の通りです。 1分ごとに録画マシンのIPアドレス宛にPingを送り、その結果Pingの応答がなかった場合、Alexaにこちらで設定した通りのセリフを喋ってもらうという流れです。
どんなセリフが良いのか考えたんですが、Twitterに貼った通り、まぁこれなら、ゆかさんも気づくだろうという内容にしました。
これもう、Alexaに喋らせるんじゃなくて、メール配信で良くない?
と言われました。ごもっともです。ただちょっと、遊び心を入れてみたかったのですよ。
他にも応用できるかも
例えば、時間指定でWebにある天気の文字列を正規表現で拾い、読み上げさせたり、雨が降るタイミングで教えさせたり。 それか他のセンサー類と組み合わせて、アレクサに「いらっしゃいませ」と言わせたり。考えれば考えるほどいろいろできそうです。
何より Node.jsのコードを書かなくても、それとなく仕組みが使えるNode-REDが素晴らしいですね。便利です。
Alexaにもっと仕事をさせたい方は参考にしていただければ幸いです。