say sumn for me 2
さて、前回の続き。
- When I Want(時間で)
- If She Felt Temp/Humidity(温湿度センサから)
- When She Saw(カメラから)
- 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が古い製品なので本当に動くか
早く試したいから。