動作環境
- 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++;
最終的には以下のようなコードになった。
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 にも公開してみた。