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) => { 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;
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();
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();
this.ret=null; this.ret=sc.hasTimeCome(); if(this.ret.result&&!this.snooze) this.bowwow(this.ret.message);
}
bowwow(msg){ mq.push(this.changeVariables(msg)); }
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が古い製品なので本当に動くか
早く試したいから。
コメント: