INV485 RJ-45 port on the front panel, shared with the Wi-Fi dongle connector. If the Wi-Fi dongle is not installed, this port is available for direct RS-485 communication.EG4-6000XP-MODBUS-Communication-Protocol PDF from EG4 support or your distributor.INV485 RJ-45 port and bridges Modbus RTU to TCP. It operates in two network modes simultaneously:BAT COMM RJ-45 port connects to battery CAN bus for BMS communication. This port uses the Pylontech or LuxPower CAN protocol to read battery parameters (SOC, voltage, current, temperature, cell data) and manage charge / discharge limits. It is primarily intended for the inverter-to-battery link, not for user-facing data collection.For programmatic access, read battery data through the inverter's Modbus registers (which aggregate BMS data) or connect directly to the battery's own interfaces.ECOxxxx. It uses the JBD serial protocol over Bluetooth SPP (Serial Port Profile).DD A5 03 00 FF FD 77. Example read request for cell voltages: DD A5 04 00 FF FC 77.9600 baud, 8N1. This is the most reliable connection method for continuous monitoring.The Cubix 100 also exposes RS-485 and RS-232 ports on the battery face panel. These typically speak the Pylontech protocol (default) but can be switched to Voltronic or other protocols via the BMS configuration tool. The Pylontech protocol over RS-485 is what the inverter uses for battery communication.BAT COMM port. This is the primary battery-to-inverter communication channel, carrying SOC, voltage, current limits, temperature, and alarm data.The CAN protocol selection (Pylontech vs. Voltronic) is configurable via DIP switches on the battery or through the JBD BMS PC software tool.pymodbus to poll the inverter directly over RS-485 or TCP (via dongle port 8000):from pymodbus.client import ModbusTcpClient
# Connect via Wi-Fi dongle on LAN
client = ModbusTcpClient("192.168.1.x", port=8000)
client.connect()
# Read input registers (FC 0x04)
result = client.read_input_registers(0x0004, count=2, slave=1)
battery_voltage = result.registers[0] * 0.1 # decivolts
battery_soc = result.registers[1] # percent
# Read holding registers (FC 0x03)
# result = client.read_holding_registers(addr, count, slave=1)
client.close()import serial
ser = serial.Serial("/dev/ttyUSB0", 9600, timeout=2)
# Request pack info (register 0x03)
ser.write(bytes.fromhex("DD A5 03 00 FF FD 77"))
response = ser.read(64)
# Parse: voltage (bytes 4-5), current (6-7),
# remaining cap (8-9), nominal cap (10-11),
# cycles (12-13), ...
if response[0] == 0xDD and response[1] == 0x03:
voltage = int.from_bytes(response[4:6], 'big') * 0.01
current = int.from_bytes(response[6:8], 'big', signed=True) * 0.01
soc = response[23] # state of charge %
# Request cell voltages (register 0x04)
ser.write(bytes.fromhex("DD A5 04 00 FF FC 77"))
cell_data = ser.read(64)
ser.close()