LoginSignup
4
2

More than 5 years have passed since last update.

Amazon Dash Button で Radiko をリモコンがわりに操作する

Last updated at Posted at 2017-01-03

動作環境

  • MacBook Pro + OS X Mavericks
  • node.js v6.9.1

Amazon Dash Button を手に入れた

node のパッケージモジュールを使って、話題の Amazon Dash Button をハックできるらしいという情報を入手して、500円という値段もあり、興味本位で正月休みを利用して、何かできないかと考えてみた。

セットアップ

Amazon Dash Buttonを(正しくない方向で)使ってみた

を参考に、セットアップ。

$ sudo npm run scan

でつまずき、通信周りのモジュールがうまく起動しないようなエラーが出たので、node.js のヴァージョンを上げてみたり、一旦 node_modules を削除して、再度 npm install したりすることで、なんとか scan スクリプトは立ち上がる。最終的に Hello World なボタンの押下は確認できるようになった。

が、いつも通り特にやることが見当たらない

使えそうな利用法を想定してみる

まずワンボタンで何かするとしたら、インターホン的なものを想定してみるものの、すでに存在するものを上書きする必要もあまり無い。 Slack で何か通知しようかと思いきや、通知するものが特に思い当たらない。やはり何かリモコン的な使い道があるものはないか。と探っていった結果、いつも流しているラジオに辿り着いた。

Radiko を制御してみる

今までは OS X (macOS)の画面共有機能を使って、Radiko の選局をリモートで行っていたが、このボタンで出来てもいいかなと思い立つ。

node でブラウザ的制御を行うために、 Selenium をいれる。

Chrome での起動が理想的だったが、OSの環境が古いせいか、どうもうまくいかないので、比較的導入し易い Firefox を利用するために geckodriver もインストール。

$ npm -g install selenium-webdriver
$ npm -g install geckodriver

これで、Firefox を利用できるようになったので、

Selenium WebDriverで実践的テストケースを作成する(node.js編)

を元にテストしてみる。

var webdriver = require('selenium-webdriver');
var driver;

driver = new webdriver.Builder()
.forBrowser('firefox')
.build();

driver.get('https://www.google.co.jp/').then(function(){
  driver.quit();
});

Firefox が立ち上がり、 Google が表示されて閉じられる。このコードを先ほどの dash-button 取得のものに取り込んで修正してみる。

ラジコのサイトへアクセスし、選局する

サイトの要素は findElements() を使って取得する。

driver.findElements(webdriver.By.css('#station-list li')).then((stationslist) = > {
  stations = stationslist.length;
});

上記のコードで、地域ごとに異なるはずのラジオ局の数が取得できる。関東の場合は13局。この要素内をボタン押すごとに順繰り回して選局してゆく。要素を click() することで画面と音声が切り替わるので、以下のような記述で順に切り替えてゆける。

if (ch > stations) ch = 1;
driver.findElement(webdriver.By.css('#station-list li:nth-child(' + ch + ')')).click();
ch++;

最終的には以下のようなコードになった。

app.js
const DashButton = require("dash-button");
const PHY_ADDR = "xx:xx:xx:xx:xx:xx";

let button = new DashButton(PHY_ADDR);

const webdriver = require('selenium-webdriver');

let driver;
let By = webdriver.By;

let stations;
let ch = 1;

driver = new webdriver.Builder().forBrowser('firefox').build();
driver.get('http://radiko.jp/').then(() = > {
  driver.findElements(webdriver.By.css('#station-list li')).then((stationslist) = > {
    stations = stationslist.length;
  });
});

button.addListener(() = > {
  if (ch > stations) ch = 1;
  console.log(ch + '/' + stations);
  driver.findElement(webdriver.By.css('#station-list li:nth-child(' + ch + ')')).click();
  ch++;
});

ただ、選局は地デジよりも遅いレスポンスなので、単純にラジオの音声の ON/OFF だけでもいいかなと思った次第。そして何よりもこのリモコンをどこに置くかという点で、radiko 起動の Mac の前に置くくらいだったら、操作した方が早いというのが難点。さらにこの起動が面倒なので Macの起動時にこいつが立ち上がる工夫も施したいところ。この状態で未完成のまま一旦放置。

Selenium との組み合わせで何かしら面白いことはできそう。

一応 Github にも公開してみた。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2