ゆるブロ

ゆる~くてちたのIT系?ブログ

スマートメーターから取得したデータをDBに書き込みまくる(更新)

はじめに/やりたいこと/注意点

DBにデータをガンガン書き込みたい。

どうして1つの機体でやってないかという点は突っ込んではいけない。

更新

TimeZoneの設定がイケてなくて、あとの処理で詰まってしまった。そのため、一部修正。

環境

参考文献

psycopg2の導入

raspberry pi 3にpsycopg2がインストールされていなかったので実施。
案の定エラー発生。

参考文献があったのでよかた。

yatta47.hateblo.jp

というかちゃんとエラーを見ればわかったことだったけど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]は電気ケトルをつけたときになります。こうやって見ると面白いね。

f:id:TeTiTa:20200505132831g:plain

DB書き込み

追記

dataのカラムを見ての通り、Timezoneが設定されていない。さらにDBのタイムゾーンは初期値であり、UTCだった!これでGrafanaと連携したときにうまく変換されなかったので修正する。おそらく、DB的にはJSTで表示しているんだけど、Grafanaから取得したときに謎にUTCJSTの変換が行われて9時間進んでしまっていた。

修正は、①DBのタイムゾーン設定、②タイムゾーンを含めたデータの作成を実施した。

①DBのタイムゾーン設定

scientre.hateblo.jp

うまく書き変わりますた。

SELECT NOW();
--> 2020-05-05 06:14:57.147651+00

SET timezone TO 'Asia/Tokyo'
--> 2020-05-05 15:16:07.283963+09 

タイムゾーンを含めたデータの作成

qiita.com

python2.7であることを意識して修正。3系にするときにもう一度修正せねば・・・

# Raspbessy piから明示的にUTCで送りつけるとうまくいった。
d_utc = datetime.datetime.now(pytz.utc)

これらを実行した結果、欲しい状態になりましたとさ。
IDが227と228がおかしい状態。IDが232以降が欲しい状態。

f:id:TeTiTa:20200505172610g:plain

修正後のDB

 

完走した感想

ここにくるまでいろいろとみちくさ食ったけども、良い勉強になりましたよん。

こっからはどうやってグラフで見るかを考えねば。

あとは、30分電力値をどのタイミングで取得することにするか、どう実装するか、考えよう。

追記

問題は発生したけど、GW前半に躓いていたところよりは全然だな。。。あの3日間はマジでもったいなかったな。。。