<IfModule mod_proxy.c>
ProxyPreserveHost On
ProxyPass /iot http://xxxx.xxx.xxx.xxx:3000
ProxyPassReverse /iot http://xxx.xxx.xxx.xxx:3000
</IfModule>
部屋の温度・湿度等をRaspberry Pi/RPZ-IR-Sensorで計測して,データをDBに保存して可視化するシステムを作成する。
使用するのはRaspberry Pi Zero Wで,RPZ-IR-Sensorをスタックしてもピッタリ。
RPZ-IR-SensorはIndoor Corgi社が販売しているRaspberry Pi/Zero用の拡張ボードで,温度・湿度・気圧・照度の計測機能と赤外線リモコン機能が搭載されている。以前,Amazonから5000円ぐらいで購入した。
Raspberry Piの40pin拡張コネクタにスタック装着して使用する。
自前のサーバーでMariaDBを使用しているので,そこにRaspberry Piで計測データを保存するDBを作成することにした。
DB: envdb TABLE: iot COLUM: id int auto inc rooms varchar(50) time datetime temperrature float humidity float pressure float illuminance float
カラムは,id,rooms(部屋の名前), time(日付時間),temperrature(温度),humidity(湿度),pressure(気圧),illuminance(照度)で作成した。
以下のコマンドでDB envdbを作成する。
$ mysql -u root -p MariaDB[(none)]> create database envdb; MariaDB[(none)]> grant all privileges on envdb.* to yuji@"%" identified by 'zzzzzzzz' with grant option; MariaDB[(none)]> flush privileges;
テーブルiotを作成する。
MariaDB[(none)]> use envdb; MariaDB[(envdb)]> create table iot (id int not null auto_increment,rooms varchar(50), time datetime, temperature float, humidity float, pressure float, illuminance float,primary key (id)) auto_increment=1;
テーブルの確認をする。
MariaDB[(envdb)]> show tables; +-----------------+ | Tables_in_envdb | +-----------------+ | iot | +-----------------+ MariaDB[(envdb)]> show columns from iot; +-------------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+-------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | rooms | varchar(50) | YES | | NULL | | | time | datetime | YES | | NULL | | | temperature | float | YES | | NULL | | | humidity | float | YES | | NULL | | | pressure | float | YES | | NULL | | | illuminance | float | YES | | NULL | | +-------------+-------------+------+-----+---------+----------------+
これで計測データを保存するDBが作成出来た。
Raspberry Pi Zero WのプログラムはPythonで作成した。
Raspberry Pi Zero W(Raspbian buster)でI2Cインターフェースを使用できるように,デバイスドライバーをDevice Treeを使ってロード出来るようにする。
/boot/config.txtに以下を追加する。
dtparam=i2c_arm=on
/etc/modulesに以下を追加する。
i2c-dev
Raspberry Pi Zero Wを再起動した後,デバイスドライバーがロードされているのとデバイスファイルが作成されているのを確認しておく。
# lsmod | grep i2c i2c_bcm2835 7818 0 i2c_dev 7171 0 # ls -la /dev/i2c* crw-rw---- 1 root i2c 89, 1 4月 13 04:05 /dev/i2c-1
I2Cインターフェースに接続されているデバイスを確認してみる。
$ i2cdetect -l i2c-1 i2c bcm2835 I2C adapter I2C adapter $ i2cdetect -y 1 0 1 2 3 4 5 6 7 8 9 a b c d e f 00: -- -- -- -- -- -- -- -- -- -- -- -- -- 10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 20: -- -- -- -- -- -- -- -- -- 29 -- -- -- -- -- -- 30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 70: -- -- -- -- -- -- 76 77
RPZ-IR-SensorのBME280(0x76,0x77)とTSL2561(0x29)が接続されているのが確認できる。
i2cdetectコマンドが無い場合は,
# apt install i2c-tools
でインストールする。
BME280とTSL2561用のPythonパッケージは,RPZ-IR-Sensorのサンプルプログラムに入っていたものを少し修正して使用している。
BME280で温度・湿度・気圧を計測する時に使用するパッケージはbme280i2c.py。温度が高く検出されるため修正した。
- ! - | | | ! - ! - ! - ! - ! - ! - ! - ! - ! - ! - ! - ! - ! - ! - ! - ! |
|
TSL2561で照度を計測するパッケージはtsl2561.py。照度が0luxの時にdevide by zeroエラーが出るbugを修正した。
- ! - | | | ! - ! - ! - ! - ! |
|
Raspberry Piで計測して計測したデータを,Ambientに送信するのと,ローカルのDBに保存するプログラム。
Ambientにデータを送信するためPythonのambientパッケージをインストールした。
$ pip3 install git+https://github.com/AmbientDataInc/ambient-python-lib.git
ローカルのDB(MariaDB)と接続するために,PythonのPyMySQLパッケージをインストールした。
$ pip3 install PyMySQL
部屋の温度・湿度・気圧・照度を計測してDBへの記録するプログラムsensor.pyを作成した。
センサーは拡張ボードのBME280を使っている。
- ! - | | | | | | | | | | ! |
|
cronで10分ごとにsensor.pyを起動するようにしている。
0-59/10 * * * * /home/yuji/work/homesensor/sensor.py -a 2>&1
これで10分毎に計測して,計測したデータをAmbientに送信し,同時に上記のローカルDBに保存している。
上記のように計測したデータはAmbientとローカルサーバーのDBに保存している。
これでAmbientにアクセスして,データをグラフで表示できるようになった。
AmbientはIoTデータを可視化するCloud WEBサービスで,無料で使用することが出来る
このようにして,WEBブラウザでチャンネルを表示するとグラフでデータを確認できるようになった。
いつでもいろいろな端末から,WEBアクセスすることで計測データを見ることが出来る。
無料でこれだけの機能を提供してもらえるので,1年間のデータ保存期間(2023/05/01から4ヶ月)はしょうがないと思う。
Ambientは無料で便利に利用していたのだが,規約が変更になりデータ保存期間が2023/05/01から4ヶ月になってしまう。
そこでローカルDB保存してあるデータを直接グラフ表示することにした。
いろいろ探してみると,GrafanaというGrafana Labsがオープンソースで開発しているマルチプラットフォームで動作するログ・データ可視化ツールを見つけた。
GrafanaはDBにクエリ問い合わせをして取得したデータを,グラフ等に表示することも出来るようだ。
表示する期間や時間帯を変えたり,パーツ毎に特定のノードだけのデータを表示したり,インタラクティブに可視化を操作することが出来る。
対応しているデータソースやDBは数多くある。データソースプラグインを作成することも出来る。
これ以外にもいろいろ対応しているようだ。
インストールは公式サイトに説明がある。
自前のローカルサーバー(CentOS 7.9)に以下のようにしてインストールした。
Grafanaリポジトリを追加する。
/etc/yum.repos.d/grafana.repoを作成する。
[grafana] name=grafana baseurl=https://rpm.grafana.com repo_gpgcheck=1 enabled=1 gpgcheck=1 gpgkey=https://rpm.grafana.com/gpg.key sslverify=1 sslcacert=/etc/pki/tls/certs/ca-bundle.crt exclude=*beta*
パッケージ管理ツールで,Grafanaをインストールする。
# yum check-update # yum install grafana
インストール後にいくつか設定を行った。
Apache経由でアクセスできるようにするため,/etc/httpd/conf.d/grafana.confファイルを新規作成する。
<IfModule mod_proxy.c>
ProxyPreserveHost On
ProxyPass /iot http://xxxx.xxx.xxx.xxx:3000
ProxyPassReverse /iot http://xxx.xxx.xxx.xxx:3000
</IfModule>
Grafanaの設定ファイル/etc/grafana/grafana.iniを編集する。
: protocol = http http_adr = 192.168.XXX.YYY domain = yueno.net root_url = https://xxxx.xxx/iot :
Apacheを再起動する。
# systemctl restart httpd
Grafanaの自動起動を有効にして,起動する。
# systemctl enable grafana-server # systemctl start grafana-server # systemctl status grafana-server
Grafanaで可視化する場合は,Dashboardを作成してDashboard毎に可視化パーツを設定していく。
全てGrafanaに管理者でログインしてWEBで設定できる。
作成・設定したDashboardは保存出来て,設定をJson形式でexportしてバックアップも出来る。
GrafanaへWEBブラウザでURLに https://xxxxxx.xxxx/iot としてアクセスする。
ログイン画面が表示されるので,最初は管理者ユーザーでログインする。
user: admin password: admin
でログイン出来る。ログイン後パスワードを変更するように促されるので変更する。
Grafanaはユーザーをチームというユーザーグループで管理している。
チーム別にトップ画面を変更することが出来るみたい。
Teams → New teamをクリックして,チーム名を入力した後にCreateでチームを作成できる。
チームを作成したらユーザーを追加する。
Add member → Add to teamでユーザーを追加出来る。
Teamsで作成したチームをクリックするとチームの設定ができる。
Settings → Home dashboardでデフォルトのダッシュボードを設定できる。(前もって☆マークを付けておく必要がある。)
GrafanaでサーバーのDBにアクセスするための設定を行う。
Host: DBのIP Address:3306 Database: envdb User: yuji Password: ZZZZZZZZ
これでGrafanaからMariaDBに接続できるようになる。
Grafanaに新規に作成したユーザーでログインするとデフォルトのダッシュボードが表示されるので,データをグラフ表示するダッシュボードを作成する。
SELECT CONVERT_TZ(time, '+00:00', '-09:00') AS "time", temperature 温度,humidity 湿度 FROM envdb.iot WHERE $__timeFilter(time) ORDER BY time
これでダッシュボード画面に戻ると温度・湿度,気圧,照度のデータを表示するグラフが作成できた。
Grafanaでグラフ化できるデータは,「時間の要素を持つ数値データ」のみのようだ。
画面右上の丸い矢印アイコンのRefresh dashboardをクリックすると,アイコンの右にドロップダウンメニューが表示されるため,5sを選択するとグラフが5秒おきに更新されるみたいだ。
最後に,新しく作成したダッシュボードをSave dashboardをクリックして保存する。
これで,計測したデータを可視化出来るように出来た。
Raspberry Pi Zero WとRPZ-IR-SensorのBME280とTSL2561との通信はI2Cバスを使用している。
このため,GPIOコネクタの3pinにスイッチ等は接続できない。
Raspbianでは,RPZ-IR-Sensorを改造するなどしてI2Cバスを別のGPIOを使ってソフトウェア的にI2C通信できるようにDevice Treeのoverlay機能にi2c-gpio(デバイスドライバー)が用意されている。
例えば,GPIO5(29pin)とGPIO6(31pin)をI2Cバスとして使いたい場合は,/boot/config.txtに以下のように追加する。
dtoverlay=i2c-gpio,bus=2,i2c_gpio_sda=5,i2c_gpio_scl=6,i2c_gpio_delay_us=2
i2c_gpio_delay_us=2にすることで,通信速度が通常のI2Cバスと同じ100kbpsになる。
この時,GPIO5とGPIO6の回路にプルアップ抵抗10kΩを実装する必要がある。
GPIO0(27pin)とGPIO1(28pin)は1.8kΩでプルアップされているため,ここを使う場合はハードウェア追加は必要ないと思われる。
dtoverlay=i2c-gpio,bus=2,i2c_gpio_sda=0,i2c_gpio_scl=1,i2c_gpio_delay_us=2
新しくコメントをつける