これまで、SwitBotの温湿度計を使って自宅の各所の温度湿度をAWSのS3にストアするようにできてました。
osamuk.hatenablog.jp
osamuk.hatenablog.jp
で、その温度湿度計測データをS3保存だけでなく、自宅ラズパイでGrafana+Influxdbのダッシュボードに表示できるようにしようと。
今回もほぼ全編他力本願で作り、結果こんな感じにできました。

これを作るにあたって、せっかくSwitchBotのWebhookでデータ更新のあったタイミングで通知してもらえているので、ラズパイ側からポーリング的にデータを取りに行くのではなく、WebSocketでAWS側から自宅ラズパイに計測データをプッシュするようにしました。
AWSでWebSocket使うにはAPI GatewayとLambdaの組み合わせで実現できます。このあたりを参考にさせていただきました。
Amazon API Gateway の WebSocket API を理解する | Fintan
チュートリアル: WebSocket API、Lambda、DynamoDB を使用して WebSocket チャットアプリを作成する - Amazon API Gateway
上のAWSのチュートリアルはWebSocketクライアントとの接続情報を覚えておくのにDynamoDBが使われています。でも私の使い方ではWebSocketクライアント自宅ラズパイ1つだけなので、クライアントの接続情報はS3にファイルで保存してます。このLambda関数内でSwitchBotの計測データを受けて自宅ラズパイのWebSocketクライアントにプッシュするところを作っておきます。
ラズパイ側もPythonで実装していて、WebSocketのライブラリはwebsocket-clientを使いました。
ラズパイで受けたデータはInfluxDBにストアします。このあたりを参考にさせていただきました。
Pythonで収集したデータをInfluxDBに格納してGrafanaで可視化する #Ubuntu - Qiita
ここまでWebSocket用のLambda関数で自宅ラズパイとの通信ができるようにできたので、あとは、前回までで作ったSwitchBotのWebhookを受けるためのLambda関数でS3にデータ保存してたところに、今回作ったWebSocket用のLambda関数の呼び出して温度湿度計測データを渡すところを追加しました。こちら参考にさせていただきました。
AWS LambdaからLambdaを非同期で呼び出す(Python) #Python3 - Qiita
呼び出しLambda関数側の設定で他のLambda関数を呼び出すためにはポリシーで権限を与える必要があるところは注意点ですね。
"Action": ["lambda:InvokeFunction"]