make the smart speaker smarter 7

09/08

say sumn for me 2

さて、前回の続き。

  1. When I Want(時間で)
  2. If She Felt Temp/Humidity(温湿度センサから)
  3. When She Saw(カメラから)
  4. If She Felt Someone(人感センサから)

2のデータを取得するところまでやったので
次はそれに従って喋らせるところまで。

Let’s get busy again

データを取得して、判定するところをつくったので
早速動かしてみる。

Rpi+2s

前回作ったメインモジュールにセンサの評価を
追加する。

あと、前回はメッセージを直列につないでから
Google Homeに渡していたけど
asyncモジュールのqueue関数を使うと
一々そんなこと考えなくていいのではと思い
ちょっと入れてみた。
今のところどんな恩恵を受けているか
わからないけど、エラーにはなっていないので
取り入れてよかったなと。

こんな感じ。

const googleSpeak = require('./GoogleSpeak');
const scheduleCaller = require('./ScheduleCaller');
const Tenki = require('./Tenki');
const jdg = require('./Judge');
const async = require('async');

var sleep=(s) => {
    var e = new Date().getTime() + (s * 1000);
    while (new Date().getTime() <= e);
}

var mq=async.queue((msg, callback) => {
    //console.log(msg);
    var gs=new googleSpeak();
    gs.bowwow(msg);
    setTimeout(() => {
        callback(null);
    }, 2000);
}, 2);

class Rpi2s {

    constructor() {
    }

    howling(){
        this.ret;
        this.fc = new Tenki();
        let sc = new scheduleCaller();
        this.snooze=false;

        //check Lux
        let getlux=async () => {
            let lk=[];
            let j=await new jdg();
            lk=await j.getdata('lux').catch(e => {
                console.error(e);
                sleep(2);
                getlux();
                return true;
            });
            this.ret=await j.thresholds('lux',lk);
            this.snooze=this.ret.snooze;
            if(this.ret.result&&!this.snooze)
                this.bowwow(this.ret.message);
            return true;
        }
        getlux();

        //check Temp
        let gettemp=async () => {
            let lk=[];
            let j=await new jdg();
            lk=await j.getdata('temp').catch(e => {
                console.error(e);
                sleep(2);
                gettemp();
                return true;
            });
            this.ret=await j.thresholds('temp', lk);
            this.snooze=this.ret.snooze;
            if(this.ret.result&&!this.snooze){
                this.bowwow(this.ret.message);
            }
            return true;
        }
        gettemp();

        //check Schedule
        this.ret=null;
        this.ret=sc.hasTimeCome();
        if(this.ret.result&&!this.snooze)
            this.bowwow(this.ret.message);

    }

    //Say sumn
    bowwow(msg){
        mq.push(this.changeVariables(msg));
    }

    //text translation
    changeVariables(txt){
        var message=txt;
        var weather=this.fc.getWeather();
        return message
            .replace(/\$MONTH/i, new Date().toFormat("M"))
            .replace(/\$DAY/i, new Date().toFormat("D"))
            .replace(/\$HOUR/i, new Date().toFormat("H"))
            .replace(/\$MINUTE/i, new Date().toFormat("M"))
            .replace(/\$SECOND/i, new Date().toFormat("S"))
            .replace(/\$WEATHER/i, weather.weather[0].wamei);
    }

}
module.exports=Rpi2s;

Daemonize

上記のモジュールを20秒間隔で実行するようにしてみる。
こんな感じ。

const Rpi2s=require('./Rpi+2s');

var rpi2s=new Rpi2s();
var runrpi2s=()=>{
    rpi2s.howling();
    setTimeout(runrpi2s,20*1000);
}
runrpi2s();

これをrpi2s.jsなんてファイルにして
foreverに渡してやる。

pi@raspberrypi:/srv/google-home-helper $ forever start rpi2s.js

今のところ動いているけど
20秒間隔で値を取っているので、ScheduleCaller.jsの方に影響が
出てしまっていて、時刻を指定していると20秒×3回はしゃべることになる。
時報を設定していると、例えば12:00になって「12時をお知らせします」って
喋ってくれるのだが、12:01になるまで3回は教えてくれる。
いやわかったって
ってなる。

あと、温度の上昇時もずっと「暑くないですか?」みたいなことを喋る。
回数制限つけたほうがいいな、これ。

考えよう。

Next

さて次は、Google Homeから少しはなれて
赤外線コントロールをしてみたいと思う。
KURO-RSが古い製品なので本当に動くか
早く試したいから。


コメント: