R筋

プログラミングと時々育児

Raspberry pi + google homeで最近やったこと

結局ハマっちゃうわけです。楽しいから仕方ないことですね。

・現在のマーケット情報を確認する。

f:id:anpontan382:20180424220732p:plain
コマンド実行時に日経新聞社の世界の市況ページをスクレイピングし、読み上げる仕組みだ。
www.nikkei.com
概要はこちら。
f:id:anpontan382:20180424221027p:plain
朝の時間に準備しながら、世界中の通貨や指数をたれ流したかったのだが、google-home-notifierで読み上げられる文字数は100文字程度が上限のようで、指数にして3~4つが限界だった。
また、「+」「ー」をカタカナに、「-」を「から」に置換する等、読み上げをする上で自然になるよう置換が必要である。
スクレイピング部分のコードを載せておく。

var client = require('cheerio-httpcli')
var URL = 'https://www.nikkei.com/markets/worldidx/'

var data = [];
var data2 = [];
var target =["日経平均(円)","ドル・円","NYダウ工業株30種(ドル)","米10年国債"];
var str =""
//抽出対象の銘柄
client.fetch(URL,function(err,$,res){
    if(err){console.log(err);return;}

var table = $('.cmn-table_style1 tr')
//tr内を取り出す

    for(var i=0,l=table.length;i<l;i++){
        var cells=table.eq(i).children();
        data[i]=[];
        for( var j=0,m=cells.length;j<m-1;j++ ){//m-1とすると最終列(時間帯)は含めない
            data[i][j] = cells.eq(j).text();//i行目j列の文字列を取得
           }
           data2[i]=data[i].join('。')//列を結合
           data2[i]=data2[i].replace("+","プラス")//置換
           data2[i]=data2[i].replace("-","マイナス")        
           data2[i]=data2[i].replace("-","マイナス")
           data2[i]=data2[i].replace("-","から")
           data2[i]=data2[i].replace("(","ポイント。")
           data2[i]=data2[i].replace(")","")
           data2[i]=data2[i].replace("※","")
           //console.log(data2[i])
           for(var k=0,n=target.length;k<n;k++){
                if(data2[i].indexOf(target[k])==0){//targetに該当する行を取り出す
                    str+=data2[i]+"\n"
                } 
           }   
    }

    str=str.replace("?","")
    console.log(str)
   
googlehome.notify(str, function(res) {
    console.log(res);
  })
})
}

出来上がったのはこちら。
日経新聞のページに表示されている値なのでマーケットがオープン中なら現在値、クローズ後なら終値が読まれる。


この声での数字の読み上げはなんか頭に入ってこない…
それと、元から「日経平均は?」「ドル円は?」等へは解答してくれるので、全指数をまとめて読み上げることが文字数の制限で無理な時点で実装する意味があんまない機能でした。

NASの音楽ファイルを再生する。

f:id:anpontan382:20180424225100p:plain
NASに置いた音楽ファイルをランダムに再生してくれる。
概要はマーケットとほぼ同じ。
f:id:anpontan382:20180424225303p:plain
NASのマウントはこちらを参考に実施。
www.mana-cat.com
NAS上に音楽フォルダを作成し、その中に音楽ファイルを格納する。
後はパスを指定してgoogle-home-notifierに送ればいいのかと思いきや、google-home-notifierのファイルパスではなくhttp:~のURLを指定しないといけない。
そのため、音楽フォルダでミュージックサーバを立てる。
参考にしたのは次のサイト。
scrapbox.io
プログラムの流れは以下の通りとなる、①と②はnohupで常に実行しておく。
①nodeでミュージックサーバを立てる。
②firebaseのDBの更新があったら③を実行する
③ミュージックサーバの各ファイルへのURLをランダムに取得しGoogle homeで再生する。
①は上記サイト、②は過去の記事を参照。
anpontan382.hatenablog.com
③のコードはこんな感じで出来た。全体を関数としてexportしている。

exports.playmusic=function(){

var fs = require('fs');
const googlehome = require('google-home-notifier');
const language = 'ja';
googlehome.device("Google-Home", language);
googlehome.ip("192.168.***.***");//googlehomeのIPアドレス

fs.readdir('/home/pi/nas/music', function(err, fileList){
    if (err) throw err;
   
    //console.log(fileList);
    randomfile = fileList[Math.floor(Math.random() * fileList.length)];
    url ='http://192.168.***.***:3000/music/' + randomfile;
    //ラズパイのIPアドレス+ポート+ミュージックサーバのパス+NASからランダム
 //に取得した音楽ファイル

    console.log(url);

googlehome.play(url, function(res) {
  console.log(res);
});

僕は現在300曲程をNASに保存しているが、「再生」というとランダムにgooglehomeが再生してくれる。
曲が多すぎて聞きたい曲が流れることはない。そのため、今後の改良としてはフォルダ毎にプレイリストを作り「〇〇(フォルダ名)を再生」と言うと、フォルダ内の曲だけが流れるようにできるとより音楽プレイヤーとしての利用が捗りそう。