Renogy Charge Controller

Now that the solar panel and charge controllers are doing their job, I started looking at different ways of monitoring the system remotely. Renogy has a bluetooth dongle that plugs into the RS232 port of the charge controller, but according to reviews, the corresponding phone app is buggy and lacks features. On Github, there is a nice project using a Raspberry Pi connected directly to the RS232 port, but I don't like running my Raspberry Pi's in harsh environments. My choice would be to connect an Arduino directly to the charge controller and use it to send MQTT messages to a remote MQTT broker running on a Raspberry Pi inside air conditioned space in my home. Node Red, running on the same Pi, would then display and chart the data. Of course this required running power and an ethernet cable from the house making the whole solar setup rather redundant. 

The Installation

Power for the Arduino Uno comes from house power, but could easily be powered by the charge controller. Note the ethernet cable plugged into the ethernet shield. You may be able to use a WiFi shield, but my shed is clad in aluminum so wireless connections are not possible.

 The Arduino Stack

This in an Arduino Uno, inside a printed enclosure designed to mount on a DIN rail, with an Ethernet Shield, a prototyping board and RS232 to TTL converter. The cable connects to the solar charge controller with an RJ12 (AKA 6P6C) connector. I purchased the RS232 to TTL converter on Amazon https://amzn.to/46Beywk. You get 5 boards for $7.89. I modified a DB9-Female to DB9-Male cable found in my junk box. I cut the Female end off and crimped on a RJ-12 connector.

RJ12

I copied this image from https://github.com/mickwheelz/NodeRenogy and cropped out the DB9 connector because the pin numbers of their DB9 didn't match up with the DB9 on my converter board. To find out which pin on your RS232/TTL converter board is RS232 Tx, connect Vcc (5v) and Ground and measure the voltage on the DB9 pins and find the one measuring -5 to -15 volts or so. The Rx pin will be close to zero volts. Connect the Tx pin to pin 2 (Rx) on the RJ12 and the Rx pin to pin 1 (Tx). In my case, pin 1 connected to pin 3 on the DB9, pin 2 connected to DB9 pin 2 and pin 3 (ground) connected to DB9 pin 5.

Important Note: The Ethernet shield uses the IC2 pins and digital pins 4 and 10 on the Arduino. These should be avoided when setting up SoftwareSerial. I chose pin 7 for serial data Rx and pin 8 for serial data Tx. Connect pin 7 to the Rs232/TTL converter Rx pin and pin 8 to the Tx pin.

Ethernet Shield to Uno Wiring

Some header pins on the Ethernet Shield passing through to the Uno accomplish the same thing.

RS232 to TTL Converter

The DB9 connector is the RS232 interface with the solar charge controller and the 4 header pins connect to the Arduino's 5v (Vcc), Ground, TTL receive (Rx) and transmit (Tx) pins. I use pin 7 for Rx and pin 8 for Tx, defined for SoftwareSerial in the Sketch.

Renogy Solar Charge Controllers use the MODBUS protocol for communications through the RS-232 port. Each MODBUS device on a MODBUS network will have a unique Device ID. An address of 0 (Zero) is a broadcast address on which all devices should respond. Since RS-232 is a point to point connection, there can only be one device connected at a time. I found conflicting information about the Renogy Wanderer Modbus address. Some report an address of Zero, some say the address is 255 (0xFF).  I found an Arduino sketch called scanModbusID, modified the SoftwareSerial pins and changed the Device ID holding register address to:

#define DEVICE_ID_REG   0x01A

When I ran the sketch, a MODBUS device was found with an address of 1 (0x01)

I modified a sample sketch from this library:

https://www.arduino.cc/reference/en/libraries/sensormodbusmaster/

to read various holding registers used by the Wanderer. The sketch basically waits for something to be published on the MQTT Topic solarmon/fetch. Node Red on the Raspberry Pi does this every 60 seconds. When it sees a new data on solarmon/fetch, the Arduino reads 5 Holding Registers on the charge controller and publishes the data to 5 topics (solarmon/*). Node Red reads the new data, formats it, and displays the data in gauges and charts.
Below is the sketch:

Click to expand sketch... (copy sketch to your Arduino IDE)

// ---------------------------------------------------------------------------

// Include the base required libraries

// ---------------------------------------------------------------------------

#include <Arduino.h>

#include <SensorModbusMaster.h>

#include <Ethernet.h>

#include <MQTT.h>


byte mac[] = {0x00, 0x50, 0x56, 0xFE, 0x09, 0x96}; //a MAC address I made up

byte ip[] = {192, 168, 86, 19};  // <- change to match your network

EthernetClient net;

MQTTClient client;




// ---------------------------------------------------------------------------

// Set up the sensor specific information

//   ie, pin locations, addresses, calibrations and related settings

// ---------------------------------------------------------------------------


// Define the sensor's modbus address

byte modbusAddress = 0x01;   // The sensor's modbus address, or SlaveID

long modbusBaudRate = 9600; // The baud rate the sensor uses


// Define pin number variables

const int DEREPin = -1;       // The pin controlling Recieve Enable and Driver Enable

                              // on the RS485 adapter, if applicable (else, -1)

                              // Setting HIGH enables the driver (arduino) to send text

                              // Setting LOW enables the receiver (sensor) to send text


// Construct software serial object for Modbus

// The Uno only has 1 hardware serial port, which is dedicated to comunication with the computer

// If using an Uno, you will be restricted to using AltSofSerial or SoftwareSerial

#include <SoftwareSerial.h>

const int SSRxPin = 7; // Recieve pin for software serial (Rx on RS485 adapter)

const int SSTxPin = 8; // Send pin for software serial (Tx on RS485 adapter)

SoftwareSerial modbusSerial(SSRxPin, SSTxPin);



// Construct the modbus instance

modbusMaster modbus;


// ---------------------------------------------------------------------------

// Main setup function

// ---------------------------------------------------------------------------

void setup()

{


  Ethernet.begin(mac, ip);

  client.begin("192.168.86.177", net); //IP address of your MQTT/NodeRed Raspberry Pi

  client.onMessage(messageReceived);

  connect();


    // Turn on the "main" serial port for debugging via USB Serial Monitor

    Serial.begin(115200);


    // Turn on your modbus serial port

    modbusSerial.begin(modbusBaudRate);

    // NOTE:  Software serial only supports 8N1

    // Turn on debugging, if desired

    // modbus.setDebugStream(&Serial);

    // Start the modbus instance

    modbus.begin(modbusAddress, modbusSerial, DEREPin);

}




void connect() {

  Serial.print("connecting...");

  while (!client.connect("arduino", "try", "try")) {

    Serial.print(".");

    delay(1000);

  }


  Serial.println("\nconnected!");


  client.subscribe("solarmon/fetch");

}


void messageReceived(String &topic, String &payload) {


    int deviceStatus = 0;

    char msg_out[50];

    

    deviceStatus = modbus.int16FromRegister(0x03, 0x108 , bigEndian); //PV Current

    dtostrf(deviceStatus,3,1,msg_out);

    client.publish("solarmon/PVcurrent", msg_out);

    

    deviceStatus = modbus.int16FromRegister(0x03, 0x107 , bigEndian); //PV Voltage

    dtostrf(deviceStatus,3,1,msg_out);

    client.publish("solarmon/PVvolts", msg_out);


    deviceStatus = modbus.int16FromRegister(0x03, 0x101 , bigEndian); //Battery Voltage

    dtostrf(deviceStatus,3,1,msg_out);

    client.publish("solarmon/BatteryVolts", msg_out);


    deviceStatus = modbus.int16FromRegister(0x03, 0x102 , bigEndian); //Battery Charging Current

    dtostrf(deviceStatus,3,1,msg_out);

    client.publish("solarmon/BatteryCurrent", msg_out);


    deviceStatus = modbus.int16FromRegister(0x03, 0x100 , bigEndian); //SOC

    dtostrf(deviceStatus,3,1,msg_out);

    client.publish("solarmon/SOC", msg_out);

}

void loop() {

  client.loop();

  if (!client.connected()) {

    connect();

  }

}


The Raspberry Pi

The Raspberry Pi hosts a MQTT broker. I've always used Mosquitto. Be sure to enable remote access so the Arduino can subscribe and publish. You will also need Node Red. From Node Red's "Manage Palette" menu, install node-red-dashboard to display gauges and graphs.

Node Red Flow

I created this simple flow to display data received from the Renogy Wanderer. You will see this after you import the flow below.

Node Red Dashboard

The flow creates this simple dashboard. You may have to play around with the dashboard to get it to display properly.

Click here to view the Node Red flow. Copy the text and import to your Node Red installation.

[

    {

        "id": "a74763ae71a302cd",

        "type": "tab",

        "label": "Solarmon",

        "disabled": false,

        "info": "",

        "env": []

    },

    {

        "id": "e29aa47c947dec09",

        "type": "mqtt out",

        "z": "a74763ae71a302cd",

        "name": "Fetch",

        "topic": "solarmon/fetch",

        "qos": "2",

        "retain": "false",

        "respTopic": "",

        "contentType": "",

        "userProps": "",

        "correl": "",

        "expiry": "",

        "broker": "ca7a18775340a8c9",

        "x": 530,

        "y": 240,

        "wires": []

    },

    {

        "id": "31ab2a3e2cdd2014",

        "type": "ui_gauge",

        "z": "a74763ae71a302cd",

        "name": "",

        "group": "667aba52aa645d2f",

        "order": 3,

        "width": 0,

        "height": 0,

        "gtype": "gage",

        "title": "PV Voltage",

        "label": "Volts",

        "format": "{{value}}",

        "min": 0,

        "max": "50",

        "colors": [

            "#00b500",

            "#e6e600",

            "#ca3838"

        ],

        "seg1": "",

        "seg2": "",

        "className": "",

        "x": 890,

        "y": 360,

        "wires": []

    },

    {

        "id": "e888645dbde08e3c",

        "type": "function",

        "z": "a74763ae71a302cd",

        "name": "/10",

        "func": "msg.payload = Number(msg.payload)/10;\nreturn msg;",

        "outputs": 1,

        "noerr": 0,

        "initialize": "",

        "finalize": "",

        "libs": [],

        "x": 550,

        "y": 420,

        "wires": [

            [

                "56d29b8372166784",

                "1e608c4fb838b4bf"

            ]

        ]

    },

    {

        "id": "3bedabe0dad0e834",

        "type": "inject",

        "z": "a74763ae71a302cd",

        "name": "Fetch data every 1 minute",

        "props": [

            {

                "p": "payload"

            }

        ],

        "repeat": "60",

        "crontab": "",

        "once": false,

        "onceDelay": 0.1,

        "topic": "",

        "payload": "1",

        "payloadType": "str",

        "x": 280,

        "y": 240,

        "wires": [

            [

                "e29aa47c947dec09"

            ]

        ]

    },

    {

        "id": "67f60f4331a3cb63",

        "type": "function",

        "z": "a74763ae71a302cd",

        "name": "/10",

        "func": "msg.payload = Number(msg.payload)/10;\nreturn msg;",

        "outputs": 1,

        "noerr": 0,

        "initialize": "",

        "finalize": "",

        "libs": [],

        "x": 550,

        "y": 780,

        "wires": [

            [

                "aa719a7bfeee8c11"

            ]

        ]

    },

    {

        "id": "fb7c72a96fcb4ffa",

        "type": "ui_gauge",

        "z": "a74763ae71a302cd",

        "name": "",

        "group": "11894b8176063fbf",

        "order": 3,

        "width": 0,

        "height": 0,

        "gtype": "gage",

        "title": "Battery Voltage",

        "label": "Volts",

        "format": "{{value}}",

        "min": "0",

        "max": "16",

        "colors": [

            "#00b500",

            "#e6e600",

            "#ca3838"

        ],

        "seg1": "",

        "seg2": "",

        "className": "",

        "x": 900,

        "y": 720,

        "wires": []

    },

    {

        "id": "cf8c2a5a33026c1a",

        "type": "function",

        "z": "a74763ae71a302cd",

        "name": "/100",

        "func": "msg.payload = Number(msg.payload)/100;\nreturn msg;",

        "outputs": 1,

        "noerr": 0,

        "initialize": "",

        "finalize": "",

        "libs": [],

        "x": 550,

        "y": 540,

        "wires": [

            [

                "43915ade677157f7"

            ]

        ]

    },

    {

        "id": "0816d691e7b96fc3",

        "type": "ui_gauge",

        "z": "a74763ae71a302cd",

        "name": "",

        "group": "667aba52aa645d2f",

        "order": 6,

        "width": 0,

        "height": 0,

        "gtype": "gage",

        "title": "PV Current",

        "label": "Amps",

        "format": "{{value}}",

        "min": 0,

        "max": "5",

        "colors": [

            "#00b500",

            "#e6e600",

            "#ca3838"

        ],

        "seg1": "",

        "seg2": "",

        "className": "",

        "x": 890,

        "y": 480,

        "wires": []

    },

    {

        "id": "56d29b8372166784",

        "type": "debug",

        "z": "a74763ae71a302cd",

        "name": "",

        "active": false,

        "tosidebar": true,

        "console": false,

        "tostatus": false,

        "complete": "true",

        "targetType": "full",

        "statusVal": "",

        "statusType": "auto",

        "x": 690,

        "y": 360,

        "wires": []

    },

    {

        "id": "ab618bbd6e647e42",

        "type": "function",

        "z": "a74763ae71a302cd",

        "name": "/100",

        "func": "msg.payload = Number(msg.payload)/100;\nreturn msg;",

        "outputs": 1,

        "noerr": 0,

        "initialize": "",

        "finalize": "",

        "libs": [],

        "x": 550,

        "y": 660,

        "wires": [

            [

                "f5e9d021fec85002"

            ]

        ]

    },

    {

        "id": "3529586a7aface08",

        "type": "ui_gauge",

        "z": "a74763ae71a302cd",

        "name": "",

        "group": "11894b8176063fbf",

        "order": 6,

        "width": 0,

        "height": 0,

        "gtype": "gage",

        "title": "Charging Current",

        "label": "Amps",

        "format": "{{value}}",

        "min": 0,

        "max": "3",

        "colors": [

            "#00b500",

            "#e6e600",

            "#ca3838"

        ],

        "seg1": "",

        "seg2": "",

        "className": "",

        "x": 910,

        "y": 600,

        "wires": []

    },

    {

        "id": "03bb8d9849309c6a",

        "type": "ui_chart",

        "z": "a74763ae71a302cd",

        "name": "",

        "group": "067fac72f0d925f5",

        "order": 1,

        "width": 0,

        "height": 0,

        "label": "Battery Voltage",

        "chartType": "line",

        "legend": "false",

        "xformat": "HH:mm:ss",

        "interpolate": "linear",

        "nodata": "",

        "dot": false,

        "ymin": "10",

        "ymax": "16",

        "removeOlder": "24",

        "removeOlderPoints": "1440",

        "removeOlderUnit": "3600",

        "cutout": 0,

        "useOneColor": false,

        "useUTC": false,

        "colors": [

            "#1f77b4",

            "#aec7e8",

            "#ff7f0e",

            "#2ca02c",

            "#98df8a",

            "#d62728",

            "#ff9896",

            "#9467bd",

            "#c5b0d5"

        ],

        "outputs": 1,

        "useDifferentColor": false,

        "className": "",

        "x": 900,

        "y": 780,

        "wires": [

            []

        ]

    },

    {

        "id": "aa719a7bfeee8c11",

        "type": "smooth",

        "z": "a74763ae71a302cd",

        "name": "",

        "property": "payload",

        "action": "mean",

        "count": "5",

        "round": "2",

        "mult": "single",

        "reduce": false,

        "x": 700,

        "y": 780,

        "wires": [

            [

                "03bb8d9849309c6a",

                "fb7c72a96fcb4ffa"

            ]

        ]

    },

    {

        "id": "d622cd2199c2e4a0",

        "type": "ui_chart",

        "z": "a74763ae71a302cd",

        "name": "",

        "group": "067fac72f0d925f5",

        "order": 2,

        "width": 0,

        "height": 0,

        "label": "Charging Current",

        "chartType": "line",

        "legend": "false",

        "xformat": "HH:mm:ss",

        "interpolate": "linear",

        "nodata": "",

        "dot": false,

        "ymin": "0",

        "ymax": "3",

        "removeOlder": "24",

        "removeOlderPoints": "1440",

        "removeOlderUnit": "3600",

        "cutout": 0,

        "useOneColor": false,

        "useUTC": false,

        "colors": [

            "#1f77b4",

            "#aec7e8",

            "#ff7f0e",

            "#2ca02c",

            "#98df8a",

            "#d62728",

            "#ff9896",

            "#9467bd",

            "#c5b0d5"

        ],

        "outputs": 1,

        "useDifferentColor": false,

        "className": "",

        "x": 910,

        "y": 660,

        "wires": [

            []

        ]

    },

    {

        "id": "f5e9d021fec85002",

        "type": "smooth",

        "z": "a74763ae71a302cd",

        "name": "",

        "property": "payload",

        "action": "mean",

        "count": "5",

        "round": "2",

        "mult": "single",

        "reduce": false,

        "x": 700,

        "y": 660,

        "wires": [

            [

                "d622cd2199c2e4a0",

                "3529586a7aface08"

            ]

        ]

    },

    {

        "id": "59da1f426d3c4cb9",

        "type": "ui_chart",

        "z": "a74763ae71a302cd",

        "name": "",

        "group": "9e35e0d1e84abf70",

        "order": 2,

        "width": 0,

        "height": 0,

        "label": "PV Current",

        "chartType": "line",

        "legend": "false",

        "xformat": "HH:mm:ss",

        "interpolate": "linear",

        "nodata": "",

        "dot": false,

        "ymin": "0",

        "ymax": "5",

        "removeOlder": "24",

        "removeOlderPoints": "1440",

        "removeOlderUnit": "3600",

        "cutout": 0,

        "useOneColor": false,

        "useUTC": false,

        "colors": [

            "#1f77b4",

            "#aec7e8",

            "#ff7f0e",

            "#2ca02c",

            "#98df8a",

            "#d62728",

            "#ff9896",

            "#9467bd",

            "#c5b0d5"

        ],

        "outputs": 1,

        "useDifferentColor": false,

        "className": "",

        "x": 890,

        "y": 540,

        "wires": [

            []

        ]

    },

    {

        "id": "43915ade677157f7",

        "type": "smooth",

        "z": "a74763ae71a302cd",

        "name": "",

        "property": "payload",

        "action": "mean",

        "count": "5",

        "round": "2",

        "mult": "single",

        "reduce": false,

        "x": 700,

        "y": 540,

        "wires": [

            [

                "59da1f426d3c4cb9",

                "0816d691e7b96fc3"

            ]

        ]

    },

    {

        "id": "854802775f7f4b44",

        "type": "ui_chart",

        "z": "a74763ae71a302cd",

        "name": "",

        "group": "9e35e0d1e84abf70",

        "order": 1,

        "width": 0,

        "height": 0,

        "label": "PV Voltage",

        "chartType": "line",

        "legend": "false",

        "xformat": "HH:mm:ss",

        "interpolate": "linear",

        "nodata": "",

        "dot": false,

        "ymin": "0",

        "ymax": "50",

        "removeOlder": "24",

        "removeOlderPoints": "1440",

        "removeOlderUnit": "3600",

        "cutout": 0,

        "useOneColor": false,

        "useUTC": false,

        "colors": [

            "#1f77b4",

            "#aec7e8",

            "#ff7f0e",

            "#2ca02c",

            "#98df8a",

            "#d62728",

            "#ff9896",

            "#9467bd",

            "#c5b0d5"

        ],

        "outputs": 1,

        "useDifferentColor": false,

        "className": "",

        "x": 890,

        "y": 420,

        "wires": [

            []

        ]

    },

    {

        "id": "c6f8403480e4ce76",

        "type": "ui_gauge",

        "z": "a74763ae71a302cd",

        "name": "",

        "group": "11894b8176063fbf",

        "order": 9,

        "width": 0,

        "height": 0,

        "gtype": "gage",

        "title": "SOC",

        "label": "Percent",

        "format": "{{value}}",

        "min": 0,

        "max": "100",

        "colors": [

            "#00b500",

            "#e6e600",

            "#ca3838"

        ],

        "seg1": "",

        "seg2": "",

        "className": "",

        "x": 870,

        "y": 840,

        "wires": []

    },

    {

        "id": "ce6a51009fead10f",

        "type": "ui_chart",

        "z": "a74763ae71a302cd",

        "name": "",

        "group": "067fac72f0d925f5",

        "order": 3,

        "width": 0,

        "height": 0,

        "label": "SOC",

        "chartType": "line",

        "legend": "false",

        "xformat": "HH:mm:ss",

        "interpolate": "linear",

        "nodata": "",

        "dot": false,

        "ymin": "0",

        "ymax": "100",

        "removeOlder": "24",

        "removeOlderPoints": "1440",

        "removeOlderUnit": "3600",

        "cutout": 0,

        "useOneColor": false,

        "useUTC": false,

        "colors": [

            "#1f77b4",

            "#aec7e8",

            "#ff7f0e",

            "#2ca02c",

            "#98df8a",

            "#d62728",

            "#ff9896",

            "#9467bd",

            "#c5b0d5"

        ],

        "outputs": 1,

        "useDifferentColor": false,

        "className": "",

        "x": 870,

        "y": 900,

        "wires": [

            []

        ]

    },

    {

        "id": "3ab38a32313fe3ca",

        "type": "smooth",

        "z": "a74763ae71a302cd",

        "name": "",

        "property": "payload",

        "action": "mean",

        "count": "5",

        "round": "2",

        "mult": "single",

        "reduce": false,

        "x": 700,

        "y": 900,

        "wires": [

            [

                "ce6a51009fead10f",

                "c6f8403480e4ce76"

            ]

        ]

    },

    {

        "id": "96c758cad1062897",

        "type": "mqtt in",

        "z": "a74763ae71a302cd",

        "name": "",

        "topic": "solarmon/#",

        "qos": "2",

        "datatype": "auto",

        "broker": "ca7a18775340a8c9",

        "nl": false,

        "rap": true,

        "rh": 0,

        "inputs": 0,

        "x": 180,

        "y": 760,

        "wires": [

            [

                "d99ada98a55982bd"

            ]

        ]

    },

    {

        "id": "d99ada98a55982bd",

        "type": "switch",

        "z": "a74763ae71a302cd",

        "name": "",

        "property": "topic",

        "propertyType": "msg",

        "rules": [

            {

                "t": "cont",

                "v": "PVvolts",

                "vt": "str"

            },

            {

                "t": "cont",

                "v": "PVcurrent",

                "vt": "str"

            },

            {

                "t": "cont",

                "v": "BatteryCurrent",

                "vt": "str"

            },

            {

                "t": "cont",

                "v": "BatteryVolts",

                "vt": "str"

            },

            {

                "t": "cont",

                "v": "SOC",

                "vt": "str"

            }

        ],

        "checkall": "true",

        "repair": false,

        "outputs": 5,

        "x": 330,

        "y": 760,

        "wires": [

            [

                "e888645dbde08e3c"

            ],

            [

                "cf8c2a5a33026c1a"

            ],

            [

                "ab618bbd6e647e42"

            ],

            [

                "67f60f4331a3cb63"

            ],

            [

                "3ab38a32313fe3ca"

            ]

        ]

    },

    {

        "id": "c4e2f09e0f60f677",

        "type": "inject",

        "z": "a74763ae71a302cd",

        "name": "",

        "props": [

            {

                "p": "payload"

            }

        ],

        "repeat": "",

        "crontab": "",

        "once": false,

        "onceDelay": 0.1,

        "topic": "",

        "payload": "1",

        "payloadType": "str",

        "x": 290,

        "y": 140,

        "wires": [

            [

                "e29aa47c947dec09"

            ]

        ]

    },

    {

        "id": "1e608c4fb838b4bf",

        "type": "smooth",

        "z": "a74763ae71a302cd",

        "name": "",

        "property": "payload",

        "action": "mean",

        "count": "5",

        "round": "1",

        "mult": "single",

        "reduce": false,

        "x": 700,

        "y": 420,

        "wires": [

            [

                "31ab2a3e2cdd2014",

                "854802775f7f4b44"

            ]

        ]

    },

    {

        "id": "2b646c7e3cb69d34",

        "type": "ui_spacer",

        "z": "a74763ae71a302cd",

        "name": "spacer",

        "group": "667aba52aa645d2f",

        "order": 1,

        "width": 4,

        "height": 1

    },

    {

        "id": "e20f75919c1aad02",

        "type": "ui_spacer",

        "z": "a74763ae71a302cd",

        "name": "spacer",

        "group": "667aba52aa645d2f",

        "order": 2,

        "width": 4,

        "height": 1

    },

    {

        "id": "118d174e325d0705",

        "type": "ui_spacer",

        "z": "a74763ae71a302cd",

        "name": "spacer",

        "group": "667aba52aa645d2f",

        "order": 4,

        "width": 4,

        "height": 1

    },

    {

        "id": "a5680864ca58561d",

        "type": "ui_spacer",

        "z": "a74763ae71a302cd",

        "name": "spacer",

        "group": "667aba52aa645d2f",

        "order": 5,

        "width": 4,

        "height": 1

    },

    {

        "id": "968d880ef8b34f5d",

        "type": "ui_spacer",

        "z": "a74763ae71a302cd",

        "name": "spacer",

        "group": "11894b8176063fbf",

        "order": 1,

        "width": 4,

        "height": 1

    },

    {

        "id": "b1c45d8b4e6b419b",

        "type": "ui_spacer",

        "z": "a74763ae71a302cd",

        "name": "spacer",

        "group": "11894b8176063fbf",

        "order": 2,

        "width": 4,

        "height": 1

    },

    {

        "id": "356613448a4ac209",

        "type": "ui_spacer",

        "z": "a74763ae71a302cd",

        "name": "spacer",

        "group": "11894b8176063fbf",

        "order": 4,

        "width": 4,

        "height": 1

    },

    {

        "id": "637200f7baef7ed2",

        "type": "ui_spacer",

        "z": "a74763ae71a302cd",

        "name": "spacer",

        "group": "11894b8176063fbf",

        "order": 5,

        "width": 4,

        "height": 1

    },

    {

        "id": "6a3c5f50a1592acd",

        "type": "ui_spacer",

        "z": "a74763ae71a302cd",

        "name": "spacer",

        "group": "11894b8176063fbf",

        "order": 7,

        "width": 4,

        "height": 1

    },

    {

        "id": "9df1e436fee2963c",

        "type": "ui_spacer",

        "z": "a74763ae71a302cd",

        "name": "spacer",

        "group": "11894b8176063fbf",

        "order": 8,

        "width": 4,

        "height": 1

    },

    {

        "id": "ca7a18775340a8c9",

        "type": "mqtt-broker",

        "name": "Local",

        "broker": "localhost",

        "port": "1883",

        "clientid": "",

        "autoConnect": true,

        "usetls": false,

        "protocolVersion": "4",

        "keepalive": "60",

        "cleansession": true,

        "birthTopic": "",

        "birthQos": "0",

        "birthPayload": "",

        "birthMsg": {},

        "closeTopic": "",

        "closeQos": "0",

        "closePayload": "",

        "closeMsg": {},

        "willTopic": "",

        "willQos": "0",

        "willPayload": "",

        "willMsg": {},

        "sessionExpiry": ""

    },

    {

        "id": "667aba52aa645d2f",

        "type": "ui_group",

        "name": "Solar Panels",

        "tab": "8ecc7248fea7ec71",

        "order": 1,

        "disp": true,

        "width": "4",

        "collapse": false,

        "className": ""

    },

    {

        "id": "11894b8176063fbf",

        "type": "ui_group",

        "name": "Battery",

        "tab": "8ecc7248fea7ec71",

        "order": 3,

        "disp": true,

        "width": 4,

        "collapse": false,

        "className": ""

    },

    {

        "id": "067fac72f0d925f5",

        "type": "ui_group",

        "name": "Battery Charts",

        "tab": "8ecc7248fea7ec71",

        "order": 4,

        "disp": true,

        "width": 8,

        "collapse": false,

        "className": ""

    },

    {

        "id": "9e35e0d1e84abf70",

        "type": "ui_group",

        "name": "PV Charts",

        "tab": "8ecc7248fea7ec71",

        "order": 2,

        "disp": true,

        "width": "8",

        "collapse": false,

        "className": ""

    },

    {

        "id": "8ecc7248fea7ec71",

        "type": "ui_tab",

        "name": "Home",

        "icon": "dashboard",

        "disabled": false,

        "hidden": false

    }

]

Reference: Holding Registers supposedly supported by Renogy Wanderer

Renogy MODBUS