Raspberry Pi でRenogey Roverをロギング

ソーラーチャージャーの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)や、ソーラーパネルからの入力電圧、電流、電力などを取得するプログラムになります。こまかいコマンドのリファレンスは、下記よりダウンロード

renogy_rover/reference at master · KyleJamesWalker/renogy_rover
Python MODBUS Driver for the Renogy Rover 20A/40A Charge Controller - KyleJamesWalker/renogy_rover
#!/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のロギングについて、紹介したいと思います。

コメント

タイトルとURLをコピーしました