ソーラーチャージャーのRenogey Roverシリーズの計測データを取得します。
通常、Roverシリーズのデータ取得には、BTモジュールBT-1を使用して、スマートフォンとBluetooth接続し、専用のアプリで発電状況などの各種データを監視できます。
しかし、アプリでのデータ取得は、当然ながらスマートフォンとRoverシリーズは近くになければならず、また時系列データの取得もできません。
そこで、今回はRaspberry PiとRS232Cケーブルを使用し、Roverシリーズから発電データを取得する方法を解説します。
1.RS-232 ケーブルの製作
Renogy Roverは、RJ12コネクタを介してRS232Cにて通信しています。Renogy Roverシリーズと通信すつUSBケーブルは販売していないため、RS232C-USB変換ケーブルを利用し自作します。
今回利用したRS232C-USBケーブルは、USB-RS232-WE-1800-BT 0.0です。
市販のBT-1を分解したところ、RJ12コネクタの1番ピンがTX、2番ピンがRXとなっています。RS232Cは、全2重通信のためRXとTXを互い違いに接続するため、 USB-RS232-WE-1800-BT 0.0 のYELLOW(RXD)をRS12の1番ピンに、ORANGE(TXD)を2番ピンに接続しました。(VCC、GNDは接続しません。)
RJ12のコネクタ本体やカシメ工具は、Amazonで販売してましたのでそちらを利用しました。
2.Raspberry Pi側の設定
Raspberry Pi側は特別な設定は不要です。USBケーブルを接続し、/dev/ttyUSB*のデバイスが表示されていれば、問題ありません。なお、複数さしている場合は、*の部分が数値で変化しますので、抜き差ししながら確認するとよいです。
3.読み取りプログラム
読み取りプログラムは、Pythonを使用して作成しました。なお、python3、pip3はインストール済みとします。
また、serial通信をが必要となるため、pyserialもpip経由にてインストールする必要があります。
下記コードでは、バッテリー残量(SOC)や、ソーラーパネルからの入力電圧、電流、電力などを取得するプログラムになります。こまかいコマンドのリファレンスは、下記よりダウンロード
#!/usr/bin/python3
import serial
import struct
#CRCチェックサム用関数
#https://qiita.com/ymsk_sky/items/7e6f20b37101805594b4
def send_data(command):
crc_registor = 0xFFFF
command_hex = bytes.fromhex(command)
for data_byte in command_hex:
tmp = crc_registor ^ data_byte
shift_num = 0
while(shift_num < 8):
if(tmp&1 == 1):
tmp = tmp >> 1
shift_num += 1
tmp = 0xA001 ^ tmp
else:
tmp = tmp >> 1
shift_num += 1
crc_registor = tmp
crc = crc_registor.to_bytes(2, 'little')
return bytes.fromhex(command + crc.hex())
class Renogy():
def __init__(self, dev = "/dev/ttyUSB0"):
self.dev = dev
def connect(self):
self.client = serial.Serial(
port=self.dev,
baudrate=9600,
timeout=0.5,
bytesize=serial.EIGHTBITS,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
xonxoff=False
)
def get_renogy(self):
size = 30
self.client.write(send_data('01 03 0100 000A'))
parts = struct.unpack('>xxxhhhbbhhhhhhxx', self.client.read(size))
data = {
"Renogy_SOC": parts[0],
"Battery_Voltage": parts[1] * 0.1,
"Charging_Current": parts[2] * 0.01,
"Controller_Temperature": parts[3],
"Battery_Temperature": parts[4],
"Load_Voltage": parts[5] * 0.1,
"Load_Current": parts[6] * 0.01,
"Load_Power": parts[7],
"Solar_Voltage": parts[8] * 0.1,
"Solar_Current": parts[9] * 0.01,
"Solar_Power": parts[10]
}
return data
def close(self):
self.client.close()
if __name__ == '__main__':
renogy = Renogy("/dev/ttyUSB1")
renogy.connect()
print(renogy.get_renogy())
renogy.close()
これで、Raspberry PiにてRenogy Roverシリーズからのデータ取得が可能になりました。
次回はDALY BMSのロギングについて、紹介したいと思います。
コメント