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が古い製品なので本当に動くか
早く試したいから。


コメント: