1階と3階のraspberry piに接続している二酸化炭素濃度計のデータを1分おきにgoogle spread sheetへ記録


自粛生活中にやり始めたスマートホーム化。
仕事部屋(1階)の二酸化炭素濃度とか測ってみたいなと思って、測ってみました。
意外と高かった(1500ppmぐらいはすぐに行く)ので、寝室(3階)の二酸化炭素濃度も計測しています。

前提

  • Raspberry piの初期設定が終わっていること
  • 二酸化炭素濃度計(MH-Z19C)とジャンパーケーブルが手元にあること
  • googleのアカウントを持っていること

事前準備

  • 物理的にRaspberry piとMH-Z19Cを接続する (はんだ付け不要、ジャンパーケーブルのメスで接続)
    • ここの絵が一番わかりやすいです

  • ジャンパーケーブルはこんな感じでくっついて送られてきて、こんな感じで裂いてちぎって使います。この写真はメスメス(F-F)のケーブルで、これを使います。

  • シリアル通信を有効にする
    • 以下のページを参照して実施しています

  • raspi-configを実行
    • sudo raspi-config
  • 3 Interface Options→P6 Serial Port→
    • Would you like a login sheel to be accessible over serial? -> いいえ
    • Would you like the serial port hardware to be enabled? -> はい
  • reboot
    • shutdown -r now

データを取得

  • ライブラリをインストール(こっちはハイフン)
pip3 install mh-z19
  • 動作を確認(こっちはアンダーバー)
sudo python3 -m mh_z19
  • これで二酸化炭素濃度がとれちゃったはずです。すごくすんなりできてびっくりした記憶があります

1分おきにgoogle spread sheetに記録 (google spread sheet側の設定)

  • 基本的に以下のページを参照して実施しました

  • google spread sheetで1個ファイルを作成

    • ファイル名は自由に設定、シート名は"test1"とします
  • ツール→スクリプトエディタからgoogle apps scriptを開き、以下を貼り付ける

var spreadsheetId = 'スプレッドシートのIDを入れる'

//Postされたデータを受け取り
function doPost(e){
  var data = [      
    e.parameter.Date_Master, // マスター日時     
    e.parameter.Co2_1f, // 1階の二酸化炭素濃度   
    e.parameter.Co2_2f, // 2階の二酸化炭素濃度    
    e.parameter.Co2_3f, // 3階の二酸化炭素濃度
  ];
  //取得したデータをログに記載
  Logger.log(new Date());
  //スプレッドシートへのデータ行書き込み
  addData(e.parameter.DeviceName, data);
  return ContentService.createTextOutput("ok");
}

//スプレッドシートへのデータ行書き込み
function addData(sheetName, data){
  var sheet = SpreadsheetApp.openById(spreadsheetId).getSheetByName(sheetName);
  sheet.appendRow(data);
}

  • 公開→ウェブアプリケーションとして導入→
    • プロジェクトバージョン: new
    • Execute the app as: Me
    • Who has access to the app: Anyone, even anonymous <<<< ここは変更
  • このアプリは確認されていません→詳細を非表示→postAPITest
  • current web app URL: ここに出てくるURL(=API key)をメモ(このURLを使ってgoogle spread sheetに書き込みます)

  • curlコマンドで実行テスト

    • 以下のコマンドをraspberry piからたたく
    • API keyは↑で出てきたURLです
    • google spread sheetのC列に1000000が入るはずです
curl -L https://script.google.com/macros/s/{API key}/exec/exec -F 'DeviceName=test1' -F 'Co2_2f=1000000'

1分おきにgoogle spread sheetに記録 (raspberry pi側の設定)

  • スクリプトを作成
    • これは1階用。3階用は 'Co2_3f' に値が入るようにする。
co2.py
import mh_z19
import requests
import datetime
import csv
import pprint

dt_now = datetime.datetime.now()

sanso_node = mh_z19.read()
print(sanso_node)

deviceName = 'test1'
data = {
'DeviceName': deviceName,
'Date_Master': str(dt_now),
'Co2_1f': str(sanso_node['co2']),
'Co2_2f': "",
'Co2_3f': "",
}
url = 'https://script.google.com/macros/s/{API key}/exec'
response = requests.post(url, data=data)
  • スクリプトを実行して値がgoogle spread sheetに書き込まれることを確認

cronの設定

  • 以下の設定をします
    • 毎分データを記録
* * * * * python /{実際に保存した場所}/co2.py

3階用に同じものをもう一つ作る

  • 同じ手順を繰り返してください
  • google spread sheetには毎分2行ずつ追加されることになります
  • 一番簡単にできそうだったので、このやり方にしました

Google Data Portalで見やすく表示できるようにしています

2021年3月から始めたスマートホーム化はこちらに一覧化しています(2021年5月時点)