Raspberry Pi 3 + Google Homeでエアコンを音声操作できた
先月届いた赤外線センサーキット。
夜の空いた時間を使ってやっと開封してセットアップしたのでその過程をシェアしたい。
なんか・・生き物みたいやな・・笑
上にぴょんぴょん出ているのは温度や気圧、湿度、明度のセンサー。今回は使わないけど、部屋のコンディション記録をのちのち取ろうと計画してる。
今回は前面に付いている赤外線送受信器を使う。
成果
Google HomeからRaspberry Pi経由でエアコンを音声操作出来た〜!楽しい😆 pic.twitter.com/0kKZbNwLnf
— TAKUYA @ 週休7日で働きたい (@craftzdog) 2018年2月13日
たのしー!!リモコンが要らなくなって部屋がちょっとすっきりした。リモコンって地味に邪魔だよね。
アーキテクチャ
- Google Homeで音声入力を受け付ける
- IFTTTでwebhookを実行 (HTTPで指定したURLを叩く)
- Raspberry PiでIR送信コマンドを実行
Raspberry Piと赤外線センサーのセットアップ
このあたりを参考にしてセットアップした。 ANAVI Infrared pHATのセットアップ手順はマニュアルの通りなので本稿では割愛する。
- Raspberry Pi をディスプレイ/キーボードなしで初期設定する
- ANAVI Infrared pHAT User Manual
- How to Control Your Air Conditioner with Raspberry Pi Board and ANAVI Infrared pHAT
- lircd.conf Manual
LIRCを使ってリモコンを学習
LIRCは "Linux Infrared Remote Control" の略で、その名の通り赤外線リモコンのライブラリ。 pHATのマニュアルに従ってインストールした。使用するモジュールによってステップは異なるので割愛する。 今回は、MITSUBISHI 霧ヶ峰のリモコンを学習させたい。
IR受信器を手動で動かして、信号を読み取る。 まずはLIRCのsystemdサービスを止める:
sudo systemctl stop lircd
IR生データをstdoutに出力:
mode2 -m -d /dev/lirc0
ほんで、受信器に向けてリモコンのボタンを押下すると、以下のような出力が得られる:
4989552 3046 3019 3052 4278 615 1683 552 554 581 1675 573 718 552 555 579 1676 573 561 573 1814 580 1676 603 1666 572 561 584 691 569 554 580 553 571 562 572 693 577 556 579 554 600 1669 581 1806 577 557 578 555 579 554 580 1833 551 556 579 554 580 554 601 677 572 561 573 560 575 1680 579 1808 575 559 576 556 578 557 578 686 605 1664 573 1682 577 557 586 678 573 1683 576 1679 579 555 580 1806 577 1688 591 1670 579 1677 571 693 577 557 577 556 579 1685 563 694 576 556 578 556 600 547 577 687 573 561 573 559 583 551 576 713 546 562 573 587 547 559 607 695 575 1680 579 564 570 1676 572 717 574 559 575 585 550 1678 581 1683 596
なんじゃこりゃああ。よくわからんけど、これはhighとlowレベルのIR信号の長さを示しているらしい。
しかしながら、同じボタンを押下しても毎回微妙に違うデータが出力されるので、精度は100%という訳ではなくノイズなどが影響するっぽい。
とりあえず電源のON/OFFの二種類の信号データを取得してメモした。
注意点は、1行目のどデカい数値は不要なので無視すること。この例では4989552
を削除する。
次に aircon.lircd.conf
というファイルを /etc/lirc/lircd.conf.d/
に作成する。内容は以下の通り:
begin remote name aircon flags RAW_CODES eps 30 aeps 100 ptrail 0 repeat 0 0 gap 28205 frequency 38000 begin raw_codes name on 3427 1668 450 1248 446 1255 450 388 449 389 448 414 423 1250 444 394 443 420 417 1257 448 1250 445 419 417 1255 449 389 449 389 450 1248 445 1256 450 387 450 1056 702 1191 451 386 450 414 426 1246 444 408 438 383 445 1257 450 413 423 413 423 414 424 388 446 389 450 415 420 395 442 428 411 414 425 385 448 390 448 387 448 417 420 391 446 417 423 387 448 389 458 1240 457 383 441 393 443 1256 448 421 426 379 449 1251 442 399 440 424 411 396 441 422 414 422 415 408 430 426 411 394 443 1257 448 1252 506 331 441 421 421 401 431 396 443 395 440 425 411 423 415 423 414 441 395 423 424 414 421 389 451 389 452 393 439 386 451 391 446 386 449 387 449 388 450 405 441 412 425 389 439 386 450 414 433 390 436 415 431 385 444 386 449 390 459 376 450 414 424 392 442 388 456 383 454 407 430 408 429 409 421 387 449 390 445 389 448 415 422 387 450 388 448 422 415 415 421 390 447 389 448 389 448 415 422 389 448 389 447 1255 444 389 443 name off 3431 1669 449 1248 447 1255 449 416 422 389 453 410 423 1248 508 331 442 394 442 1152 553 1253 441 422 426 1252 449 409 421 391 445 1253 452 1248 447 391 451 1222 477 1249 445 419 418 393 443 1256 450 414 422 394 443 1249 445 394 443 394 442 394 449 420 412 392 443 395 449 414 416 395 456 381 441 396 439 424 419 390 463 374 459 417 415 386 453 382 460 403 423 414 423 387 453 415 421 1247 444 400 437 393 454 1245 509 333 443 417 426 411 425 385 447 392 445 390 446 394 443 417 419 1252 451 1251 447 390 446 417 424 396 436 391 446 391 445 417 420 418 417 419 419 419 417 396 442 425 411 393 444 393 451 386 443 394 442 420 415 397 442 394 442 395 442 394 443 394 441 401 435 397 440 423 416 401 434 397 451 412 428 382 451 386 451 387 450 384 452 387 452 417 420 409 425 393 456 375 452 386 448 388 458 379 447 397 438 394 445 421 413 420 417 389 448 389 448 391 445 417 420 1252 447 1227 473 1253 505 1195 446 417 420 391 450 end raw_codes end remote
Looks good. そしたらLIRCのsystemdプロセスを起動する。
sudo systemctl start lircd
ちゃんとリモコンが登録されているか確認する:
irsend LIST aircon "" 0000000000000001 on 0000000000000002 off
LIRCでIR信号を送信
では早速送信してみる:
irsend SEND_ONCE aircon on # 電源オン irsend SEND_ONCE aircon off # 電源オフ
エアコンが反応したら成功。 Pretty neat.
自分の場合は一発ではうまく行かず、何度か信号を取り直す必要があった。諦めずにトライだ。
REST APIでネット経由でリモコンを操作できるようにする
Raspberry Piで簡単なnode.jsのサーバを立てて、HTTPリクエストを受け付けるようにした。 ソースコードはGitHubに公開したので再利用ご自由に。
以下のようにkoaでルータを書いてリクエストを受け付けるようにした:
router.put('/aircon/power', async ctx => { const cmd = spawnSync('/usr/bin/irsend', ['SEND_ONCE', 'aircon', 'on']) if (cmd.error) { logger('irsend error:', cmd.error) ctx.body = { ok: false, message: 'irsend command failed', result: cmd.error.toString() } } else { ctx.body = { ok: true, message: 'The aircon switched ON', result: cmd.stdout.toString() } } }) router.delete('/aircon/power', async ctx => { const cmd = spawnSync('/usr/bin/irsend', ['SEND_ONCE', 'aircon', 'off']) if (cmd.error) { logger('irsend error:', cmd.error) ctx.body = { ok: false, message: 'irsend command failed', result: cmd.error.toString() } } else { ctx.body = { ok: true, message: 'The aircon switched OFF', result: cmd.stdout.toString() } } })
家のルータでポートマッピングを設定して準備完了。
IFTTTを使ってGoogle Homeから音声入力できるようにする
IFTTTでアプレットを作成する。
Google Assistantを設定
IFTTTとGoogle Homeを連携させる方法はこの辺などを参考にする:
IFTTTの Google Assistant サービスを追加。
以下のように音声入力を設定:
Webhookを設定
これで準備完了。
"Hey Google, make my room warm" と呪文を唱えれば、無事エアコンが起動。Super duper!!!
FUTURE WORK
- エアコンの起動時間を記録する
- 他のセンサーを使って部屋のコンディションを記録する
- グラフ化して見れるようにする
Google の Cloud Firestoreが用途に適していそうな気がする。