make the smart speaker smarter 17

08/04

Index

Let The Air Circulate More

久しぶりの更新。大したネタではない。

Bought a air circulator

冷夏だね、と言っていた数日前からは
考えられないほどの猛暑。

そこで赤外線リモコン付きの
送風機を購入した。
でかい羽根を回すやつではない
最近流行りのやつ。

https://images-na.ssl-images-amazon.com/images/I/31shM1iKp2L.jpg

リモコンのボタンは次の5つ。

  • 電源(入/切)
  • 風量
  • 首振り
  • モード
  • タイマー

電源を入れたり消したりを
制御したいのに、なぜ入/切
一体型のタイプを購入したのか。
いやー、失敗したな。

さて、これで入・切の制御をどうするか。
もうITと全く関係ない命題を解決
しなくてはいけなくなってしまった。

たとえばラズパイに接続している
温度センサで少しでも変化があれば
入・切を判断するって方法があるのだが
如何せん送風機とラズパイが離れていて
それができない。
では、人感センサで動きを検知できないか
とも思ったが、そもそも私が動いているのだから
絶対に不可能である。

マニュアルを見てみる。特にヒントと
なることは書いてない。

では隠しコマンド的なものがないかと
思ったが、本体についてるボタンなら
どこかのボタン2つ同時押しで強制OFFって
のがあるかもしれないが、リモコンで
それはおそらくないだろう。
私が開発者ならそんな意味のないことは
しない。

それでは今あるボタンを駆使して確実に
ONかOFFのどちらかを操作できる手順を
編み出せるかを考えてみる。
どちらかができれば、制御はできる。

例えばONを編み出すことができれば

ONにしたいとき→ONにする
OFFにしたいとき→ONにする→ON/OFF

OFFを編み出せれば

ONにしたいとき→OFFにする→ON/OFF
OFFにしたいとき→OFFにする

これができる。簡単な解法である。

例えば、こいつにタイマーボタンがある。
一回押すと1時間タイマー。
続けて押せば2、3時間ずつ加算されて
2時間、4時間、6時間と4段階で設定される。
等差数列でいうと

\(a_n={2(n-1)}+\lbrack 1/n \rbrack\)

もしくは

\(a_n={2(n-1)}+\lfloor 1/n \rfloor\)

こうかな。

これを使うと確実に1時間後には
OFFになっている確証が持てる。

私:オーケーグーグル、扇風機を切って。
GA:電源を切ります。1時間後には必ず。

他にも8時間後には切り忘れ防止の
強制タイマーが発動ってのもある。
はー、ばからしい。却下。

では、どうしよう。
あ、電源がONになったときは
KYなでかい音でピピと鳴る。
OFFのときはこれまたでかい音でピーと鳴る。
これをマイクで拾うか。
音声ファイルの解析、、やってみる価値は
あるけど、部屋がうるさかったら解析も
容易じゃないような、、。同じ周波数の音が
たまたま鳴っていたりするともちろん誤認識する。

てことで家主がいるときに家主のコントールで
入切するだけの代物になってしまった。なんだか残念。

はぁ、何をダラダラ書いてんだか。

API

さて。KURO-RSからリモコンの赤外線情報を
読み取る。

$ /usr/local/bin/kuro-rs-rec circulator-onoff
$ /usr/local/bin/kuro-rs-rec circulator-mode
$ /usr/local/bin/kuro-rs-rec circulator-timer
$ /usr/local/bin/kuro-rs-rec circulator-gain
$ /usr/local/bin/kuro-rs-rec circulator-pan

5つのボタン全部取得した。
データは/usr/local/share/kuro-rs/dataに保存しておく。
で、今の所、入/切ぐらいしか使わないので
api.jsの条件分岐に以下を追加

(snip)
    if (audioName=="light-on.txt"||audioName=="light-off.txt"||audioName=="circulator-onoff.txt") {
        let found=audioName.indexOf('light');
        let responseText=(found)?'light':'circulator';
        let rsport=(found)?2:4;
        let filename=audioName.substring(0, audioName.length - 4);
        exec('/usr/local/bin/kuro-rs-send /usr/local/share/kuro-rs/data/'+filename+' '+rsport,(err, stdout, stderr) => {
            (snip)
        }
    }
(snip)

安直に追加しただけ。
出力させるポートが部屋の電気と違うやつを使っているので
適宜変更している。
んで、こんな感じで外部から呼び出されることを期待しておいて
IFTTTで「扇風機をつけて」のレシピを書いて終わり。

Test

さてやってみる。

私:おーけーぐーぐる、扇風機をつけて。
GA:デバイスがまだ設定されていません。Google Homeアプリから追加してください。

いやいやいや、マジか。まーじか。

扇風機 って言葉既に予約語らしいぞ。使えない言葉があるのか。
なら我が家のルールに則って、スーパーロボットの名前に
してしまえだな。
こいつヒョロっとしているからガイヤーにしようかな。

いや、白黒の配色でヒョロいから
イーグルファイターにしよう。

IFTTTを変更して再チャレンジ。

私:おーけーぐーぐる、イーグルファイターの電源をつけて。
GA:電源を入れます。

ピピ!とでかい音がなりぬるい風が出始めた。
成功だ。

私:おーけーぐーぐる、イーグルファイターの電源を切って。
GA:電源を切ります。

ピー!
これもでかい音。

ちなみに同じ信号出してるのでAPIは一緒だけど
IFTTTのレシピは2個作ってる。

Next

なんてくだらない投稿。
次回はこの暑さが和らがないと
モチベーションがでない。


コメント: