DEV Community

yurfuwa
yurfuwa

Posted on

RaspberryPi + AmazonAlexa を使って部屋の湿度を喋らせる

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

作る。

センサはこれ

配線はこれとかこれあたりを参考に。

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

実行コードはここのサンプルやつを流用。

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

$ python dhht11.py
humidity: 6 %,  Temperature: 24 C
Enter fullscreen mode Exit fullscreen mode

湿度5%というのは中東バーレーンと同等らしい。アラブ人だから仕方ないね。

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

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

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

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' } })
Enter fullscreen mode Exit fullscreen mode

Alexa Skill Kit 用の AWS Lambda の実行コードは Echokit を使う。デコレータとインテントがうまく紐付いており、かなり使いやすい。

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
Enter fullscreen mode Exit fullscreen mode

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

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

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

テレーン

「うちの温度を開いて

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

鍋加湿ソリューション

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

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

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

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

なお止めると

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

やはりが欲しいので誰か買ってください

Discussion (1)

Collapse
jsalvador profile image
Juanjo Salvador

I was looking for something like this (RPi + Alexa), but... Why not English? :(