あきらぼ

テック系ブログ

RaspberryPiで計測した環境センサ情報をSQLデータベースに書き込む

こんにちは。

 

今回は先日RaspberryPiで計測した環境データをSQLデータベースサーバーにアップロードします。

 

 

 

前回はCCS811とBME280から疑似CO2濃度と気圧を取得するところまで行いました。

RaspberryPiでCO2センサーCCS811を動かす - あきらぼ

RaspberryPiでBME280で気圧測定 - あきらぼ

 

今回はここで取得した値をSQLデータベースにアップロードします。

実際のコードはこちらです。

IPアドレス等は伏せています。)

 

実際にcrontabで定期実行させたときのデータベースを確認します。

 

eCO2の値が飛んでいるのは要確認ですが、15分毎にデータがアップロードされていることが確認できます。

 

次回はデータベースの値を使ってWEBページ上でこれらの値を可視化してみようと思います。

 

今回の環境モニタシステムのコードの全体はこちらになります。

GitHub - Aki-R/RoomConditionMonitor

 

 

RaspberryPiでBME280で気圧測定

今回は気圧センサーであるBME280を使って気圧測定をしました。

 

最近梅雨入りしたせいで、ニュース等でも天気病などといって、気圧の低下に伴う体調不良が取り上げられるようになりました。
この天気病は気圧の絶対値ではなく、変化量が重要だと考えられています。

 

 

 

そこで、実際に時系列の自宅の気圧データを取得することで体調管理をしましょうというのが目的です。
完成形はこちらです。

 

 

さて、実際に実装に移っていきます。

BME280とRaspberryPiはI2Cで接続しています。

詳細はこちら

aki-lab.hatenadiary.com

 

今回使用した気圧センサーはドイツの自動車部品メーカーのボッシュ製のBME280になります。

ACEIRMC BME280搭載 温湿度 気圧センサーモジュール 5V用 SPI I2C Arduino対応 Raspberry Pi (1個)

 

データシートはこちらになります。

https://www.bosch-sensortec.com/media/boschsensortec/downloads/datasheets/bst-bme280-ds002.pdf

 

基本的にはこちらのデータシートの指示通りにレジスタを叩いてデータを取得していきます。

 

まず、実際のコードがこちらになります。

 

基本的にはデータシート通りの実装なのですが、pythonで記述する際に、変数の型が明示的ではなかったので、Numpyを使用して明示的に型変換を行うことでデータシート通りの温度と気圧の補正を行っています。

 

実際に実行するとこんな感じです。

pi@raspberrypi: python3 BME280.py
Device ID is 0x60
BME280 is connected.
Temperature 26.88 degC
Pressure 998.76 hPa

こちらの温度は気圧センサ補正に使用しているのでセンサーの温度です。

なので、室温よりは少し高い値になっているので単純な環境センサ値としては使えなさそうです。

 

あまり、レジスタ直叩きで使用している記事を見なかったので参考になればと思います。

 

実際に使用してみると、天気とは関係なく気圧が変動していることや、気密性の高いマンションだと換気扇を使うことで圧力が下がってしまうことです。

次回、頭が痛くなったときは値を確認してみようと思います。

 

コードの全体はこちらになります。

GitHub - Aki-R/CCS811_BME280_RPi: Upload CCS811 and BME280 measurement to database by using RaspberryPi

 

 

RaspberryPiでCO2センサーCCS811を動かす

こんにちは。

 

今回はRaspberryPiでCCS811を動かしました。

 

 

 

前回はRaspberryPiへの接続まで完了していました。

aki-lab.hatenadiary.com

 

KEYESTUDIO DC 5V CCS811 CO2 二酸化炭素 TVOC 大気質 センサー モジュール for Arduino アルドゥイーノ アルディーノ 電子工作

 

そして今回は実際に値を読み取るところまでを行います。

しかし、基本的なI2Cのフローは前回STM32で行った場合と同じになります。

aki-lab.hatenadiary.com

 

同じことをRaspberryPiで実装した形になります。

なので詳細は省きます。

 

今回のコードはこちらになります。

 

このまま実行します。

pi@raspberrypi: python3 CCS811_RPi.py
Device ID is 0x81
CCS811 is connected.
Application mode is in active.
Measure Mode is set to Mode1.
eCO2: 405
eTVOC: 0

 

二酸化炭素換算量が問題なく取得できました。

 

あとはこのデータをデータベースにアップロードして部屋環境モニターで使用する予定です。

 

コード全文はこちらに保存しています。

GitHub - Aki-R/CCS811_BME280_RPi: Upload CCS811 and BME280 measurement to database by using RaspberryPi

 

 

RaspberryPi3でI2Cセンサを接続する。

今回は先日購入したCO2センサであるCCS811と気圧センサであるBME280のセンサをI2CでRaspberyy Piと接続してみました。

センサーは先日STMのNucleoで動作確認したものです。

aki-lab.hatenadiary.com




センサ接続のための準備

まず、接続できるようにユニバーサル基盤にセンサを取り付ける下準備をします。

家に余っているピンソケットでかろうじてラズパイのピンをさせるようにします。

f:id:AKIRA_san:20220417141857j:plain

配線は結構汚いですがどうせ室内で固定だし「ヨシッ!」
f:id:AKIRA_san:20220417142012j:plain

余った基板部分はリューターで切ってみました。
結構硬いユニバーサル基盤ですが、意外と綺麗に切断できました。

f:id:AKIRA_san:20220417142159j:plainf:id:AKIRA_san:20220417142207j:plain

固定穴はドリルで拡張して開けました。

テキトーに足をつけて、完成!(と思ったらプルアップ抵抗つけ忘れてて後付け)

f:id:AKIRA_san:20220417142409j:plainf:id:AKIRA_san:20220417142417j:plain

これで下準備は完了。

接続確認

次に接続確認をしていきます。

まずRaspberyy PiでI2C通信を有効化します。

sudo raspi-config

メニューからI2Cを有効化します。

f:id:AKIRA_san:20220417143608p:plainf:id:AKIRA_san:20220417143633p:plain

そしたら以下のコマンドで同じI2Cライン上のデバイスを検出します。

i2cdetect -y 1

以下のように表示されます。

f:id:AKIRA_san:20220417143836p:plain

見方は列で下位4bitの値、行で上位3bitの値を示しています。
I2Cのアドレスは7bitなので行の数字が70までしかないということです。

今回はCCS811のアドレスが0x5b、BME280のアドレスが0x77なので正しく接続できていることが分かります。
恐らく、このコマンドで全アドレスにリクエストを送ってレスポンスあるアドレスが表示されているのですかね。(めんどくさいので詳しくは調べませんが(笑))

とりあえずI2Cで接続できたことを確認できたので今回はここまでです。

次回は実際のセンサ値を読み込んで色々したいと思います。

3DプリンタでRaspberryPiケース作り

今回はケースなしで剥き出しだったラズパイのケースを3Dプリンタで作ってみました。

 

今回はEthernetとUSB電源だけ繋ぎたいので直接寸法を測って合うようにケースを設計します。

 

あとは印刷するだけ。

f:id:AKIRA_san:20220110231602j:image

 

ラズパイをあてがって簡単に寸法チェックします。

 

f:id:AKIRA_san:20220110231758j:image

 

普通に一ヶ所寸法を間違えていたのでケースに入りましたが固定ができません。

 

設計し直して再印刷。

f:id:AKIRA_san:20220110231921j:image

 

今回は綺麗に出来ました。

ねじ止め用に後からタップを立てます。

 

そしたらラズパイをネジで固定

 

f:id:AKIRA_san:20220110232020j:image

Ethernetケーブルも電源ケーブルも問題なく接続できます。


f:id:AKIRA_san:20220110232017j:image

 

最後に蓋をして設置すれば完了。

これで常時Onの自宅サーバーの出来上がりです。

 

f:id:AKIRA_san:20220110232129j:image

 

今回作ったケースの3Dデータは以下にアップロードしています。

STL_Models/RaspberryPi_Case at master · Aki-R/STL_Models · GitHub

 

追記:BluetoothのUSBドングルを使いたかったので、少し大きくしてみました。

f:id:AKIRA_san:20220130100330j:plainf:id:AKIRA_san:20220130100338j:plain

 

Raspberry Pi で30分毎にPythonスクリプトを実行してMySQLに書き込む

先日、IPhoneがLANに接続されているかを確認し、状態をMySQLデータベースに書き込むコードを作りました。
Raspberry Pi でLAN内のIPhoneを監視して在宅・外出の状態をSQLサーバーにアップロード - あきらぼ

今回はこのコードを30分毎に自動的に実行されるようにします。
そのためにLinuxにおいて定期的にコマンドを実行するためのcrontabを使用します。
crontab - Wikipedia

crontabで実行するコマンドと時間をスケジュールするためには以下のコマンドを使用します。

crontab -e

するとテキストエディタでスケジューリングとコマンドの設定ファイルが開かれます。
初期設定では恐らくすべて「#」でコメントアウトされていると思うのですが、ここに以下の二行を追加します。

0 */1 * * * python /home/pi/Python/HomeAwayMonitor/homeaway.py
30 */1 * * * python /home/pi/Python/HomeAwayMonitor/homeawa.py

一行目が毎時0分に指定のコマンド(Pythonコード)を実行
二行目が毎時30分に指定のコマンドを実行
という意味合いになっており、結果30分おき、0分と30分に指定したPythonコードが実行されるという設定です。

実際に指定したコードが30分おきに実行され、データベース書き込まれているか確認してみます。

+----+---------------------+-------+
| id | date                | state |
+----+---------------------+-------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| 70 | 2022-01-04 04:00:07 | Home  |
| 71 | 2022-01-04 04:30:07 | Home  |
| 72 | 2022-01-04 05:00:08 | Away  |
| 73 | 2022-01-04 05:30:07 | Home  |
| 74 | 2022-01-04 06:00:07 | Away  |
| 75 | 2022-01-04 06:30:07 | Away  |
| 76 | 2022-01-04 07:00:07 | Away  |
| 77 | 2022-01-04 07:30:08 | Home  |
| 78 | 2022-01-04 08:00:07 | Away  |
| 79 | 2022-01-04 08:30:08 | Home  |
| 80 | 2022-01-04 09:00:08 | Away  |
+----+---------------------+-------+

問題なく、30分おきに実行されています。
しかし、ここで家にいるはずなのにいないと判定されてしまっています。
これはIPhoneがスリープ状態になるとpingすら通さなく、ARPコマンドにも応答しないのが原因のようです。
どうやらhping3でUDPでパケットを送るといiPhoneを起こせるようなので、今度試してみようと思います。

Raspberry Pi でLAN内のIPhoneを監視して在宅・外出の状態をSQLサーバーにアップロード

最近、仕事やら出張やら旅行やら遊びやらで一体どれくらい自宅が稼働しているのかを把握するために、Raspberry Piで在宅/外出をモニタするシステムを作ろうと思います。
使用しているIPhoneがLANに接続されているかどうかで在宅・外出を判断するシステムとします。
今回は前回セットアップしたSQLサーバーにIPhoneがLAN内に接続されているかどうか(在宅中か外出中か)の状態をアップロードするコードをPythonで書きます。

まず、SQLサーバーのセットアップはこちらの記事を参照。
RaspberryPiでSQLサーバー構築 - あきらぼ

また前準備として、今回はLAN内にIPhoneがいるかどうか確認するのにarp-scanコマンドを使用するのでインストールする必要があります。(下記記事参照)
Raspberry Pi でLAN内のIPアドレス一覧表示 - あきらぼ

次に今回Pythonからデータベースへの書き込みをするのでPythonのMySQLdbのパッケージをインストールする必要があります。(下記記事参照)
Raspberry Pi でPythonのMySQLClientをインストール - あきらぼ

そして今回のコードになります。

# -*- coding: utf-8 -*-

import MySQLdb
import time
from enum import Enum
import subprocess

class State(Enum):
    Home = 0
    Away = 1

if __name__ == "__main__":

    # Get LAN State to check existence of IPhone
    arp_result = subprocess.getoutput('sudo arp-scan -I eth0 -l')
    # Show arp-scan result
    print(arp_result)
    # Check if IPhone MAX adress is in LAN
    MacMatch = arp_result.find('xx:xx:xx:xx:xx:xx')
    if MacMatch == -1:
        CurrentState = State.Away
    else:
        CurrentState = State.Home
    
    # Connect to MySQL server
    connector = MySQLdb.connect(host="localhost", db="homeaway", user="user_homeaway", passwd="pass_homeaway", charset="utf8")
    cursor = connector.cursor()
    
    sql = u"insert into homeaway_table(`id`,`date`,`state`) values(0,now(),'%s')" % CurrentState.name 
    cursor.execute(sql)
    connector.commit()
    
    cursor.close()
    connector.close()
    
    #Show Current State
    print(CurrentState.name)

基本的にはarp-scanの結果から該当するMACアドレスがあるかを参照してそれに応じてHome(在宅)、Away(外出)をデータベースに送るようにしています。
今回はSQLサーバーもPython実行もRaspberry Pi になるので、localhostとなっています。

コードはGitHubにも置いてあります。
GitHub - Aki-R/HomeAwayMonitor: Monitor existence of certain device in LAN and send the status to SQL.


実際にSSH経由で実行してみます。

python homeaway.py

f:id:AKIRA_san:20220102125836p:plain

実行は問題ありません。
実際にデーターベースの書き込んだTableを見てみます。

MariaDB [homeaway]> SELECT * FROM homeaway_table;
+----+---------------------+-------+
| id | date                | state |
+----+---------------------+-------+
|  1 | 2022-01-02 12:10:19 | Away  |
|  2 | 2022-01-02 12:50:37 | Home  |
+----+---------------------+-------+
2 rows in set (0.003 sec)

問題なく書き込まれていますね。

今回はこれで終了です。

次はこのコードを一定期間(30分毎)に実行するのとデータベース上の情報をHTTPサーバー上で可視化しようと思います。

2021/01/06 追記
こちらIPhoneはスリープ(画面オフ)の状態になってしまうとWiFiをスタンバイ状態にしてしまい、ARPにも応じないようです。
スタンバイ状態でもBonjour用のポート(5353)が開いておりそこにUDPでパケット送るとWiFiが復帰するという記事を見つけたのですが、毎回復帰してくれるわけではないようです。

参考までにやり方ですが、hping3のパッケージを使用します。
デフォルトではインストールされていないので、まずこれをインストールします。

sudo apt intall hping3

次にUDPで5353ポートに3パケットを送ります。

sudo hping3 -2 -c 3 -p 5353 -i u1  (iPhoneのIPアドレス)

これでiPhoneWiFiが起きるはずなのですが、私の場合はうまくいきませんでした。

次回、WiFiではなくBluetoothで在宅モニターを行ってみようと思います。