気圧センサの Alexa 連動とグラフプロット
我が家のおしゃべりコンシェルジュのティラノくんに気圧センサBMP280を導入したことを前回報告させていただきました。
日々のお知らせにその時の気圧を付与して発話するようにしたのですが、リアルタイムの気圧が知りたいとのことで Alexa と連動もさせてみました。
また1時間ごとに気圧を測って記録しグラフで確認できるようにもしました。
目次
Alexa連動
Node-RED Alexa Home Skill Bridge というNode-REDモジュール用いて、仮想のAlexaデバイスを作成して発話応答をNode-REDへ返してティラノくんに気圧を発話させました。
構成
主要部品
- Amazon Echo Dot
- Raspberry Pi Zero W
- 気圧センサ BMP280
Node-RED Alexa Home Skill Bridgeの設定
Node-RED Alexa Home Skill Bridge用のアカウントを作成して気圧センサを起動するための仮想のAlexaデバイスを作成します。
アカウント登録
以下にアクセスして、Resisterをクリックします。
https://alexa-node-red.bm.hardill.me.uk/
ユーザ名とメアド、パスワードを登録します。
デバイス登録
登録後、Devicesタグを選択してAdd Deviceをクリックします。
気圧センサを起動するためのAlexa用デバイス”Barometric pressure”を作成しました。
Name: デバイス名 ” Barometric pressure” 入力
Description: デバイスの簡単な説明記載
Actions: デバイスの動作種類を選択。ここではOnを選択。
Onで気圧センサ値読み取りのトリガとします。
Alexaスキル Node-RED有効化
スマホのAlexaアプリでNode-REDスキルを有効にしてAlexaサービスとNode-RED Alexa Home Skill Bridgeを紐づけます。
スキルを有効にするとNode-RED Alexa Home Skill Bridgeのアカウント入力画面に切り替わるので、登録したユーザ名とパスワードを入力します。
問題なければデバイス検出画面に移行します。
端末の検出をクリックで作成したデバイスが見つかります。
定型アクションを編集
作成したデバイスの起動するための発話をカスタマイズするために、 Alexaスマホアプリで定型アクションを編集します。
Node-RED設定
node-red-contrib-alexa-home-skillをインストールします。
設定でパレットのインストールでnode-red-contrib-alexa-home-skillを検索して”install”クリックでノードが追加されます。
作成した仮想Alexaデバイス”Barometric pressure”を配置します。
ノードを配置してまずはNode-RED Alexa Home Skill Bridgeで登録したユーザ名とパスワードを入力します。
デバイスを選択します。
Alexa-homeノードを気圧センサの値を取得して発話させるノードの手前に挿入します。
動作
Alexaで設定した定型アクション文の発話で現在の気圧を発話してくれるようになりました。
定期発話報告だけではなくリアルタイムの気圧が知りたいとのことで Alexa と連動もさせてみました。 pic.twitter.com/9V34nQTMRN
— HomeMadeGarbage (@H0meMadeGarbage) September 19, 2019
参考
気圧のグラフプロット
Node-RED上で気圧センサの値を取得・記録しプロットします。
プロットには node-red-contrib-googlechart というノードを利用しました。
Node-REDフロー
1時間ごとにセンサで気圧を測定してJSON形式で記録し、Googleチャートでグラフプロットします。
- inject node
一時間ごとに起動し時間を次のノードに渡します。
- exec node
pythonコードを起動して気圧センサの値を取得して、時刻と気圧を次のノードに渡します。
bme280_sample.py内のcompensate_P(adc_P)の最後の測定値出力を以下のように修正しbme280_data.pyとしました。
sys.stdout.write(datetime.now().strftime("%Y/%m/%d-%H:%M:%S") + "\t%0.1f" % (pressure/100))
- exec node
pythonコードを起動して前段ノードからの時刻と気圧をtxtファイルに保存します。
123456789101112#coding: utf-8import sysargs = sys.argvpath_w = './bmp280/bme280.txt'with open(path_w, mode='a') as f:f.write(',' + '\r' + '{\"day\":\"' + args[1] + '\", \"kiatu\":' + args[2] + '}')f.close() - chart request node
node-red-contrib-googlechart のchart request nodeでJSON形式のデータをプロットしてグラフを生成します。
Charttype: グラフの形式を指定。ここでは線グラフのLineChartを指定
Path: グラフを表示するURLを指定します。ここでは”/kiatu05″として
node-REDのIPアドレス/kiatu05にアクセスでグラフが表示されます。
Attributes: +addでJSONデータの要素を追加します。
- file in node
③で生成した時刻と気圧のtxtファイルを読み込みます。
- function node
前段からのtxtファイルを配列形式に整形します。
- json node
前段から受け取った配列をオブジェクトに変換します。
- chart response node
JSONデータを受け取りプロットします。設定することは何もありません。
グラフ
これでスマホやPCで気圧のグラフの表示が可能となりました!
参考