スマートメーターから取得したデータをDBに書き込みまくる(更新)
はじめに/やりたいこと/注意点
DBにデータをガンガン書き込みたい。
どうして1つの機体でやってないかという点は突っ込んではいけない。
更新
TimeZoneの設定がイケてなくて、あとの処理で詰まってしまった。そのため、一部修正。
環境
- Raspberry pi 3 on データ採取
- Raspberry pi 4 on Docker
参考文献
psycopg2の導入
raspberry pi 3にpsycopg2がインストールされていなかったので実施。
案の定エラー発生。
参考文献があったのでよかた。
というかちゃんとエラーを見ればわかったことだったけどw
pi@rpi3-01:~/power $ sudo pip install psycopg2
Collecting psycopg2
Downloading https://files.pythonhosted.org/packages/a8/8f/1c5690eebf148d1d1554fc00ccf9101e134636553dbb75bdfef4f85d7647/psycopg2-2.8.5.tar.gz (380kB)
100% |████████████████████████████████| 389kB 684kB/s
Complete output from command python setup.py egg_info:
/usr/lib/python2.7/distutils/dist.py:267: UserWarning: Unknown distribution option: 'project_urls'
warnings.warn(msg)
running egg_info
creating pip-egg-info/psycopg2.egg-info
writing pip-egg-info/psycopg2.egg-info/PKG-INFO
writing top-level names to pip-egg-info/psycopg2.egg-info/top_level.txt
writing dependency_links to pip-egg-info/psycopg2.egg-info/dependency_links.txt
writing manifest file 'pip-egg-info/psycopg2.egg-info/SOURCES.txt'
Error: You need to install postgresql-server-dev-X.Y for building a server-side extension or libpq-dev for building a client-side application.
----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-HWieD7/psycopg2/
pi@rpi3-01:~/power $ sudo apt-get install libpq-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の追加パッケージがインストールされます:
libpq5
提案パッケージ:
postgresql-doc-9.6
以下のパッケージが新たにインストールされます:
libpq-dev
以下のパッケージはアップグレードされます:
libpq5
アップグレード: 1 個、新規インストール: 1 個、削除: 0 個、保留: 188 個。
317 kB のアーカイブを取得する必要があります。
この操作後に追加で 815 kB のディスク容量が消費されます。
続行しますか? [Y/n] Y
取得:1 http://ftp.tsukuba.wide.ad.jp/Linux/raspbian/raspbian stretch/main armhf libpq5 armhf 9.6.17-0+deb9u1 [122 kB]
取得:2 http://ftp.tsukuba.wide.ad.jp/Linux/raspbian/raspbian stretch/main armhf libpq-dev armhf 9.6.17-0+deb9u1 [195 kB]
317 kB を 2秒 で取得しました (112 kB/s)
changelog を読んでいます... 完了
(データベースを読み込んでいます ... 現在 135871 個のファイルとディレクトリがインストールされています。)
.../libpq5_9.6.17-0+deb9u1_armhf.deb を展開する準備をしています ...
libpq5:armhf (9.6.17-0+deb9u1) で (9.6.13-0+deb9u1 に) 上書き展開しています ...
以前に未選択のパッケージ libpq-dev を選択しています。
.../libpq-dev_9.6.17-0+deb9u1_armhf.deb を展開する準備をしています ...
libpq-dev (9.6.17-0+deb9u1) を展開しています...
libpq5:armhf (9.6.17-0+deb9u1) を設定しています ...
libc-bin (2.24-11+deb9u4) のトリガを処理しています ...
man-db (2.7.6.1-2) のトリガを処理しています ...
libpq-dev (9.6.17-0+deb9u1) を設定しています ...
pi@rpi3-01:~/power $ sudo pip install psycopg2
Collecting psycopg2
Using cached https://files.pythonhosted.org/packages/a8/8f/1c5690eebf148d1d1554fc00ccf9101e134636553dbb75bdfef4f85d7647/psycopg2-2.8.5.tar.gz
Building wheels for collected packages: psycopg2
Running setup.py bdist_wheel for psycopg2 ... done
Stored in directory: /root/.cache/pip/wheels/fb/85/a8/57f24b92b9554880384d00a84881c0ea80cbcee02d6dcede54
Successfully built psycopg2
Installing collected packages: psycopg2
Successfully installed psycopg2-2.8.5
pi@rpi3-01:~/power $
完成
SQLクライアントで確認したら、ちゃんと最新データが格納されていましたとさ。
それぞれの値の意味は以下の通り。
ID:シーケンス番号
date:取得日時
delta:瞬時電力計測値[W]
sumpower:積算電力量計測値[kWh]
ID=5のdelta=267[W]はドライヤー(冷風)をつけたとき。ID=10~13のdelta=1400[W]は電気ケトルをつけたときになります。こうやって見ると面白いね。
追記
dataのカラムを見ての通り、Timezoneが設定されていない。さらにDBのタイムゾーンは初期値であり、UTCだった!これでGrafanaと連携したときにうまく変換されなかったので修正する。おそらく、DB的にはJSTで表示しているんだけど、Grafanaから取得したときに謎にUTC⇒JSTの変換が行われて9時間進んでしまっていた。
修正は、①DBのタイムゾーン設定、②タイムゾーンを含めたデータの作成を実施した。
①DBのタイムゾーン設定
うまく書き変わりますた。
SELECT NOW();
--> 2020-05-05 06:14:57.147651+00
SET timezone TO 'Asia/Tokyo'
--> 2020-05-05 15:16:07.283963+09
②タイムゾーンを含めたデータの作成
python2.7であることを意識して修正。3系にするときにもう一度修正せねば・・・
# Raspbessy piから明示的にUTCで送りつけるとうまくいった。
d_utc = datetime.datetime.now(pytz.utc)
これらを実行した結果、欲しい状態になりましたとさ。
IDが227と228がおかしい状態。IDが232以降が欲しい状態。
完走した感想
ここにくるまでいろいろとみちくさ食ったけども、良い勉強になりましたよん。
こっからはどうやってグラフで見るかを考えねば。
あとは、30分電力値をどのタイミングで取得することにするか、どう実装するか、考えよう。
追記
問題は発生したけど、GW前半に躓いていたところよりは全然だな。。。あの3日間はマジでもったいなかったな。。。