RENOGYのROVERシリーズは、RS232ポートがついていて、オプションのBluetoothモジュールBT-1でスマホから情報取得できるのですが、常にログをとることができないため、先日監視・録画システムで屋内に移設したRaspberryPiを車庫に戻してログを撮れるようにしました。 RENOGY用のデータ収集可能なソフトウェアをみつけたので実現可能になりました。
⇒前回記事:「車庫屋根ソーラー発電システム19(パネル向き変更)
⇒関連記事:「監視・録画システム9
IMG_2604
 接続構成変更前
syako2
 接続構成変更後
solar2
 ちょっとした電子工作が必要で、監視・録画システム 集約ユニットの5V電源からRaspberryPiに電源を供給するために、PC用の4ピンコネクタからUSB端子(メス)に変換するためのコネクタを作りました。 本当は、Amazonとかでアリものを入手したかったのですが、なぜかみつけることができませんでした。 老眼なので細かな電子工作はルーペが必要でなかなかきついです。。。 夏になったら、12VのPC用ファンを増設することになりそうなのでそのコネクタ付きを流用しました。
IMG_2603
 監視・録画システム 集約ユニットにRaspberryPiを実装完了。
IMG_2605

 RENOGYとRaspberyPiを接続してttyUSB0ができていたらOKです。
# ls -l /dev/tty*
・・・
crw-rw---- 1 root dialout 188,  0 11月 22 15:17 ttyUSB0
・・・
 RaspberryPi用のPythonライブラリで、solarshed というものを導入しました。
# pip install solarshed
 インストールしたら起動します。
# python -m solarshed.server &
 以下コマンドで実行時のRENOGYの情報が取得できます。
# curl http://localhost:5000/metrics
# HELP process_virtual_memory_bytes Virtual memory size in bytes.
# TYPE process_virtual_memory_bytes gauge
process_virtual_memory_bytes 34148352.0
# HELP process_resident_memory_bytes Resident memory size in bytes.
# TYPE process_resident_memory_bytes gauge
process_resident_memory_bytes 11685888.0
# HELP process_start_time_seconds Start time of the process since unix epoch in seconds.
# TYPE process_start_time_seconds gauge
process_start_time_seconds 1606028394.94
# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds.
# TYPE process_cpu_seconds_total counter
process_cpu_seconds_total 0.39
# HELP process_open_fds Number of open file descriptors.
# TYPE process_open_fds gauge
process_open_fds 12.0
# HELP process_max_fds Maximum number of open file descriptors.
# TYPE process_max_fds gauge
process_max_fds 1024.0
# HELP solarshed_load_power_watts Load Power
# TYPE solarshed_load_power_watts gauge
solarshed_load_power_watts 3.0
# HELP python_info Python platform information
# TYPE python_info gauge
python_info{implementation="CPython",major="2",minor="7",patchlevel="16",version="2.7.16"} 1.0
# HELP solarshed_battery_volts Battery Voltage
# TYPE solarshed_battery_volts gauge
solarshed_battery_volts 25.4
# HELP solarshed_solar_volts Solar Voltage
# TYPE solarshed_solar_volts gauge
solarshed_solar_volts 34.7
# HELP solarshed_solar_amperes Solar Current
# TYPE solarshed_solar_amperes gauge
solarshed_solar_amperes 1.12
# HELP solarshed_load_volts Load Voltage
# TYPE solarshed_load_volts gauge
solarshed_load_volts 25.4
# HELP solarshed_controller_charging_state Controller Charging State
# TYPE solarshed_controller_charging_state gauge
solarshed_controller_charging_state 2.0
# HELP solarshed_battery_temperature_celsius Battery Temperature
# TYPE solarshed_battery_temperature_celsius gauge
solarshed_battery_temperature_celsius 22.0
# HELP solarshed_load_amperes Load Current
# TYPE solarshed_load_amperes gauge
solarshed_load_amperes 0.13
# HELP solarshed_solar_watts Solar Power
# TYPE solarshed_solar_watts gauge
solarshed_solar_watts 39.0
# HELP solarshed_battery_percentage Battery %
# TYPE solarshed_battery_percentage gauge
solarshed_battery_percentage 78.0
# HELP solarshed_controller_temperature_celsius Controller Temperature
# TYPE solarshed_controller_temperature_celsius gauge
solarshed_controller_temperature_celsius 28.0

 この仕組みを使って、軽くシェルで出力を整形してみます。
# cat renogy.sh
#!/bin/bash
#--
dt=`date +"%Y%m%d%H%M%S"`
renodata=`curl http://localhost:5000/metrics | awk '{if($1~/^solarshed_/)print $0}'`
for reno in $renodata
do
 if [[ $reno =~ solarshed_ ]]
 then
   ndata=$reno
   continue
 fi
 case $ndata in
 solarshed_solar_volts )
   solar_volts=$reno ;;
 solarshed_solar_amperes )
   solar_amperes=$reno ;;
 solarshed_solar_watts )
   solar_watts=$reno ;;
 solarshed_load_volts )
   load_volts=$reno ;;
 solarshed_load_amperes )
   load_amperes=$reno ;;
 solarshed_load_power_watts )
   load_power_watts=$reno ;;
 solarshed_battery_volts )
   battery_volts=$reno ;;
 solarshed_battery_percentage )
   battery_percentage=$reno ;;
 solarshed_battery_temperature_celsius )
   battery_temperature_celsius=$reno ;;
 solarshed_controller_charging_state )
   controller_charging_state=$reno ;;
 solarshed_controller_temperature_celsius )
   controller_temperature_celsius=$reno ;;
 esac
done
#--
echo ""
echo "$dt"
echo ""
echo "[SOLAR]"
echo " $solar_volts V"
echo " $solar_amperes A"
echo " $solar_watts W"
echo ""
echo "[LOAD]"
echo " $load_volts V"
echo " $load_amperes A"
echo " $load_power_watts W"
echo ""
echo "[BATTERY]"
echo " $battery_volts V"
echo " $battery_percentage %"
echo " $battery_temperature_celsius ℃"
echo ""
echo "[CONTROLLER]"
echo " state : $controller_charging_state"
echo " $controller_temperature_celsius ℃"
echo ""

 以下出力結果
20201123113333
[SOLAR]
 34.7 V
 17.06 A
 592.0 W
[LOAD]
 28.6 V
 0.1 A
 2.0 W
[BATTERY]
 28.6 V
 100.0 %
 22.0 ℃
[CONTROLLER]
 state : 2.0
 36.0 ℃

 応用でロガーを作成。crontabで10分毎に起動します。
# cat renogylogger.sh
#!/bin/bash
#--
pystr=`ps -ef | grep solarshed.server | awk '{if($8=="python")print $8}'`
if [ "$pystr" = "" ]
then
 python -m solarshed.server &
 sleep 5
fi
#--
if [ ! -d /mnt/nas1/LOG ]
then
 exit
fi
#--
dt=`date +"%Y%m%d%H%M%S"`
renodata=`curl http://localhost:5000/metrics | awk '{if($1~/^solarshed_/)print $0}'`
for reno in $renodata
do
 if [[ $reno =~ solarshed_ ]]
 then
   ndata=$reno
   continue
 fi
 case $ndata in
 solarshed_solar_volts )
   solar_volts=$reno ;;
 solarshed_solar_amperes )
   solar_amperes=$reno ;;
 solarshed_solar_watts )
   solar_watts=$reno ;;
 solarshed_load_volts )
   load_volts=$reno ;;
 solarshed_load_amperes )
   load_amperes=$reno ;;
 solarshed_load_power_watts )
   load_power_watts=$reno ;;
 solarshed_battery_volts )
   battery_volts=$reno ;;
 solarshed_battery_percentage )
   battery_percentage=$reno ;;
 solarshed_battery_temperature_celsius )
   battery_temperature_celsius=$reno ;;
 solarshed_controller_charging_state )
   controller_charging_state=$reno ;;
 solarshed_controller_temperature_celsius )
   controller_temperature_celsius=$reno ;;
 esac
done
#--
echo $dt\
,$solar_volts\
,$solar_amperes\
,$solar_watts\
,$load_volts\
,$load_amperes\
,$load_power_watts\
,$battery_volts\
,$battery_percentage\
,$battery_temperature_celsius\
,$controller_charging_state\
,$controller_temperature_celsius\
>> /mnt/nas1/LOG/solar.csv

 solarshed の出力は、監視ツールPrometheusのフォーマットになっているらしいので、導入してみました。
# apt install prometheus
 設定ファイルを変更(追加)して
# cd /etc/prometheus/
# vi prometheus.yml
・・・
- job_name: solarshed
static_configs:
- targets: ['localhost:5000']
 サービス再起動。
# systemctl restart prometheus
 ブラウザでアクセス。横軸の時間はUTCです。(調べたら変更不可っぽい。)
http://raspberrypiのipアドレス:9090
prom3
 こう見ると、まともな発電時間は6時間程度ということがわかります。
prom4

 引き続き、Grafana をRaspberryPiに導入してみます。 Grafana 7.3.4 導入ガイドページ(⇒ARMv7)に従って導入しました。
# apt-get install -y adduser libfontconfig1
# wget https://dl.grafana.com/oss/release/grafana_7.3.4_armhf.deb
# dpkg -i grafana_7.3.4_armhf.deb
# systemctl daemon-reload
# systemctl enable grafana-server
# systemctl start grafana-server
# systemctl status grafana-server
 httpでRaspberyPiのIPアドレス:3000にアクセスする。admin/adminでログインして、すぐにパスワードを変更しておく。以下トップ画面で「データソースの追加」ボタンをクリックする。
01
 「Prometheus」をクリックする。
02
 HTTPのURLにPrometheusのURLを入力して、「Save&Test」をクリックする。
03
 トップ画面から「ダッシュボードの追加」をクリックする。
04
 「ダッシュボード」に5つのメトリックスを追加してみた。
05
 画面右上の選択ボックスで横軸を簡単に変えられる。
06
 そういえば、横軸の時間軸が何もしていないのにUTCからロケール(日本時間)に変換されているようです。

 次に、Grafana にD3 Gauge プラグインを追加してみます。
# grafana-cli plugins install briangann-gauge-panel
# chown -R grafana:grafana /var/lib/grafana/plugins
# systemctl restart grafana-server
 ダッシュボードに追加してみた。
07