Raspberry piでセンサーデータを取得し,Google スプレッドシート,Data Studioで表示する

以前,Raspberry piで部屋の温湿度を記録することをしていました.Raspberry piのGPIO経由でセンサーデータを取得し,SQLiteで保存して,PHPでブラウザに表示させるようにしていました.Raspberry piのサーバーは公開していなかったので,この方法では,ローカルLAN内でしかデータを参照することができませんでした.Raspberry piを再度動かしはじめたので,今回はインターネット経由でデータを参照できるようにしてみました.

Raspberry piを公開設定にするのはセキュリティの面から避けたかったので,Raspberry piで取得したデータをGoogle スプレッドシートに転送し,Google Data Studioで表示させることにしました.次のページを参考にさせていただきました.

家の中のセンサデータをRaspberryPiで取得しまくり、スーパーIoTハウスを実現

https://qiita.com/c60evaporator/items/283d0569eba58830f86e

将来的にはセンサーを用意したいのですが,今のところハードウェアを用意している時間がなかったので,手っとり早くRaspberry piのCPU温度を定期的に記録させることにしました.

参考にしたページのソースコードをそのまま利用させていただいたので,単純なことをやらせているのに冗長になっています.当初,1秒毎に3回データを取得して平均をとっていましたが,単回取得のデータとそれほど違いがなかったので省略しました.

import os
import time

class GetCPUData():
    def get_cpu_data(self):
        return self._decodeSensorData()

    def _decodeSensorData(self):
        with open('/sys/class/thermal/thermal_zone0/temp') as t:
            temp = int(t.read()) / 1000
        sensorValue = {
            'SensorType': 'RaspberryPi',
            'CPU_Temperature': temp
        }
        return sensorValue

CPUの温度データを取得するためのプログラムを作り,ほかは流用させていただきました.もとのプログラムの汎用性が高く,その良さをそのまま活用させていただきました.

先のページで詳しく解説されていますが,私の知識不足でつまずいた点がいくつかありました.

①loggingが動作しない
実行ログやエラーログを出力するようになっていますが,上手く動作させられませんでした.エラーの内容としては「ディレクトリ,ログファイルが存在しません」というものでした.ファイルがなければ自動で作成されるはずなのに…と思ったのですが,要はそのファイルを入れるディレクトリはこちらで作成する必要がある,ということでした.ディレクトリを用意したところ,ログが出力されるようになりました.作成するディレクトリはユーザーや権限に注意する必要があります.

②cronで実行できない
ソースコードのパスが一部相対パスになっていたので,絶対パスにしたところ解決しました.

③Google スプレッドシートに転送できない
最初のデータ送信時に1行1列のセルに「Master_date」を入力することで解決しました.

順調に出力されるようになりましたので,次にNature Remoからデータを取得してみることにしました.

1番目に紹介したページでは,RemoのAPIで取得したデータをrjsonという変数に格納します.我が家ではRemoを2台利用しているので,そのままでは2台の機器のデータがどちらも含まれてしまいます.そのため,どちらのデータなのか選択する必要がありました.ので,次のページを参考にして,Macaddressにより機器を特定することにしました.

Nature Remo + Python + Heroku でお家データを定期計測してみよう!

https://makitat.com/wp-1/2019/nature_remo_house_data_collect/
# select device
if macaddr:
    device = [d for d in rjson if d['mac_address'] == macaddr]
    device_data = device[0]
else:
    device_data = devices[0]

rjsonに格納されたデータをMacaddressで選別して格納し直し,そのデータを戻り値として_decodeSensorDataに渡しています.このソースを追加して2台の機器のデータを別々に取得できるようになりました.なお,設定ファイルにMacaddressを追記しておく必要があります.

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA