IRKitスマートホームスキルの改良(1)
照明の輝度調整機能と状態を返す機能を追加してみました
昨年、IRKitで照明の電源をオン・オフするAlexaスマートホームスキルを作りました。これは、音声で電源を操作できるだけの本当に最小限の機能しかありませんでした。ところで、ウチの照明(シーリングライト)のリモコンには「調光」機能があります。
「調光」と言っても少し暗くなるだけで、段階的な輝度調整ができるわけではありません。最近のLED照明だったら多段階の輝度調整や色味の調整まで出来るんでしょうけど、ウチのは安い蛍光灯(FHC)なので、リモコンで操作できるだけでもありがたいことです。Alexaの照明用スマートホームスキルでは輝度調整させることもできますので、この機能を使ってウチの照明(シーリングライト)の調光もさせてみたいと思います。
それから、昨年作った照明のスマートホームスキルには重大な機能が欠落しています。それは照明器具の状態を訊かれても何の応答も返さないという事です。
IRKitはリモコンの信号を送信するだけですから、その信号を受信した照明器具が実際にどんな状態になったかは知る由もありません。リモコン信号を送信しても大元の壁のスイッチが切ってあったら何も反応しませんし、IRKitから照明の電源を入れた後で人がリモコンを操作して照明を切ったりするかもしれません。
今、照明器具の状態はどうなってる?そんな事をIRKitに尋ねたところで分かるわけがないですね。しかし、スマートホームスキルでは、(スマホでAlexaアプリを操作した際などに)デバイスの状態を割と頻繁に訊いて来るのです。さて、どうしましょう?
先ず思いつく方法として、常に一定の応答を返すという方法があります。つまりスマートホームスキルが「デバイスの状態はどう?」と訊いて来たら、必ず「OK大丈夫。今は電源オフで、輝度0%状態だよ」と返事をする方法です。これなら簡単に機能追加できますが、スマホのAlexaアプリで照明の電源を操作すると、電源をオンにしてもアプリ上の照明の表示はすぐにオフ状態になってしまいました(実際には照明は点いているんですよ)。これなら応答を返さない方がマシかもしれません。
次に思いついた方法としては、最後にスマートホームスキルで操作した結果を保存しておき、状態を訊かれたら保存しておいた結果に基づいた応答を返す方法です。つまり、「アレクサ、リビングの照明をつけて」と指示された際に、照明の電源はオン、輝度は100%と保存しておき、その後にスマートホームスキルが「デバイスの状態はどう?」と訊いて来たら、「OK大丈夫。今は電源オンで、輝度は100%だよ」と返事をするわけです。人が壁のスイッチやリモコンを操作すると、保存しておいた結果とは違う状態になるわけですが、それには目を瞑ります。再びAlexaに声で指示すれば、保存してある状態が現在の状態になるわけです。
後者の仕様の方が筋が良いですが、これを実現するためには操作した結果を保存しておく仕組みが必要になります。幸いなことにAWSにはDynamoDBというデータベースがあり、これにデータを保存することができます。データベースと言うと、SQL文を使って操作しなければならない難しいイメージがありますが、DynamoDBはNoSQLなデータベースで割と簡単に使用することができそうです。DynamoDBの使用料も、個人ではとても使い切ることができないような無料利用枠がありますので、課金の心配もないでしょう。
と言うことで、DynamoDBを使って操作結果を保存し、それに基づいた状態通知応答を返却することを目標とします。
大まかな手順としては以下のようになります。
- Lambdaの実行ロールに、DynamoDBのアクセス権を追加する
- DynamoDBに保存先のテーブルと項目を作成する
- LambdaにDynamoDBを読み書きする機能を追加する
- 行った操作をDynamoDBに保存し、状態レポートを応答する処理を Lambadaに追加する
[続く]
|