RaspberryPi + AmazonAlexa を使って部屋の湿度を喋らせる
Tags: raspberrypi, ai, python, aws
Published: 2018-01-04 07:22:57

---
title: RaspberryPi + AmazonAlexa を使って部屋の湿度を喋らせる
published: true
description: 温湿度センサーから得た値をAmazonAlexaに喋らせる。
tags: raspberrypi,ai,python,aws
---

部屋の乾燥が気になる季節。
加湿器を使って部屋を加湿している人も多いだろう。
自分はほしい加湿器(通称[壺](https://www.balmuda.com/jp/rain/))があるものの、どの程度加湿されるのか怪しい。
まずは部屋がどの程度乾燥しているのか、そして加湿するとどのような変化があるのか定量的に視覚化したい。

作る。

センサは[これ](http://amzn.to/2lS6X7o)。

![](https://thepracticaldev.s3.amazonaws.com/i/0bvb81pzqkgh68wavnpy.jpg)

配線は[これ](http://osoyoo.com/ja/2017/07/06/dht11/)とか[これ](http://www.kabegiwablog.com/entry/2017/09/21/214548)あたりを参考に。

![](https://cdn-ak.f.st-hatena.com/images/fotolife/k/kabegiwakun/20170921/20170921212028.png)

自分のRaspberryPiのモデルは2011 12のModel B。GPIO配列はこう。

{% twitter 948241332539027456 %}

実行コードはここの[サンプル](http://osoyoo.com/driver/pi3_start_learning_kit_lesson_17/dht11.py)やつを流用。


フムー。干からびてしまう。


```shell
$ python dhht11.py
humidity: 6 %,  Temperature: 24 C
```

湿度5%というのは[中東バーレーン](monsieurshibata.cocolog-nifty.com/blog/2010/03/5-f4e3.html)と同等らしい。アラブ人だから仕方ないね。

次にAlexaに接続する。アーキテクチャ。


![](https://thepracticaldev.s3.amazonaws.com/i/iyjejwiwbp828z4c0fms.jpg)


raspの実行コードからdynamodbにデータを格納し、AWS Lambdaを経由してAlexa Skill kitで喋らせる。


実行コードに以下を追加し、boto3からdynamodbのテーブルにアップデートを掛ける。一分毎の update_itemなので、キャパシティは全く気にする必要がない。DIYのデータストアに最適なのがDynamodbなんだよな。


```python
def update_data(temp,humidity):
    db = session.resource('dynamodb')
    table = db.Table('room-status')
    room = table.update_item( Key = {'room' : 1 }, AttributeUpdates={ 'temp': { 'Value': temp, 'Action': 'PUT' }, 'humidity': { 'Value': humidity, 'Action': 'PUT' } })
```

Alexa Skill Kit 用の AWS Lambda の実行コードは [Echokit](https://github.com/arcward/echokit) を使う。デコレータとインテントがうまく紐付いており、かなり使いやすい。


```python
import os
from echokit import EchoKit
import boto3
from boto3.session import Session
from boto3.dynamodb.conditions import Key, Attr

application_id = os.environ['APP_ID'] if 'APP_ID' in os.environ else 'amzn1.ask.skill.000'
app = EchoKit(application_id, verify_app_id=False)
handler = app.handler

# LaunchRequest
@app.launch
def on_launch(request, session):
    data = get_data()
    return app.response("部屋の温度は、{}度、湿度は{}%です".format(data['temp'],data['humidity']))


def get_data():
    db = session.resource('dynamodb')
    table = db.Table('room-status')
    room = table.get_item( Key = {'room' : 1 } )['Item']
    return room
```

読み取って喋るだけ。Alexaは喋りたい内容をJSONで適切に返す必要があるが、Echokitはうまく隠蔽してくれるのが良い。flask的な発想で実装されている。

Alexa Skillkitの登録周りは割愛。インテントモデルモクソもない。AWSLambdaのARNを登録するだけでいい。このタイプは本来スマートホームAPIを使うべきだが、スマートホームAPIにはEchoの高級なモデルか、Bluetoothのハブとなる端末を別途実装or買う必要がある。
インターネットに我が家の湿度情報を放流するほうが簡単である。
しかし恐らくこの実装は審査に通るまい。（Alexa Skill storeに登録するには審査が必要なのだ）

なのでここでスキルの実機端末へのクローズベータテストの機能を使う。これを使うと、特定のAmazonアカウントに対してクローズドベータと称してスキルをばらまくことができる。


テレーン

{% youtube 5khHjIZobXY %}

「うちの温度を*開いて*」

となっているのは、スマートホームAPIを使っていないからである。件の機能を使うと「うちの温度いくつ？」等でイケると思う。

## 鍋加湿ソリューション

さて、Alexaに湿度を喋らせることが出来たので、いつでも部屋の湿度はわかるが、湿度は全く改善していない。

加湿器を買えという意見もあるが、水を加熱すると蒸気が出ることが知られています。

{% twitter 948560124288802816 %}

日本の家はよくできており、匂いがリビングに充満しないように熱い空気がキッチン上空に停滞するような構造になっている。なのでサーキュレータで無理やりリビングに空気をデリバリーした。

{% twitter 948564232274001922 %}

鍋加湿ソリューションで短時間に55%を達成したが、水の補給と火の始末がめんどくさい。
寝るときは止める必要があるのが課題。

なお止めると

{% twitter 948794018535632896 %}

ものの1.5時間で湿度が半分になり、5%に向けて突き進む。
鍋加湿ソリューションにはサステナビリティがない。


やはり[壺](https://www.balmuda.com/jp/rain/)が欲しいので誰か買ってください