Magnum Energy Network
Magnum Energy (ME) has implemented a proprietary network using an industry standard for serial data named RS-485. For ME’s purposes this works well. It allows the interchange of settings and data between a remote control device and the other devices connected to the network. It also allows the remote to send commands to these devices, such as “enable inverter”, “start generator” etc. However the protocol they implemented is very time critical and sends a continuous stream of messages, called packets, with no process to pause transmission. It is just a continuous stream of packets sent in an orderly fashion. Some information only get transmitted when required. This timeliness of packets means that not all information is always available to this software which only samples the packets at intervals. Due to the nature of the protocol to send continuous information and the behaviour of the computers that can use this software it is impossible to read and process all the data generated. I will explain what and how data is processed later in this section.
All information presented here is based on my interpretation of observed behaviour and my understanding of the protocol published by ME in a document named Magnum Networking Communications Protocol. There have been many versions of this document and there is contradictory information in each. There is no public, complete, version available at this time. The information in this section may be wrong and will be amended as needed.
The Process
The remote control device is the center of the universe for packets transmission but the timing is regulated by the inverter. The network will not operate without an inverter connected.
These are the known list of components. Depending on the model and revision number of your remote control not all components are supported.
INV - Inverter
REMOTE - Remote control or advance router (this is a 2 in one)
BMK – Battery Monitor kit
AGS – Automatic Generator Start
RTR – Router – separate for packet purpose although sometimes integrated physically
PT100 – PT-100 charge controller
ACLD – AC Load Diverter
The protocol
Inverter transmits a packet and waits to receive a packet
Remote, being in receive mode, reads the packet from inverter
Remote replies to inverter with settings data and optionally a command such as “toggle inverter on/off” but appends data at end of packet with a device byte for one of possible peripherals.
If the peripheral exists, it will reply with a specific packet containing data. This packet is consumed by the remote to update its stored information
100ms after it previous transmission, the inverter sends another packet
This cycle repeats forever.
This is a simplification. The information exchange is a little more complicated.
The remote polls for all devices, but poles only one device per cycle. There is limited time before the next inverter TX so each cycle is, at most, an INV TX, an REMOTE TX and one device TX (as response)
On cycle 1 ARC will send an AGS packet, on cycle 2 a BMK and so on. If the device is connected it will respond with a device specific packet but not always immediately. If the remote doesn’t get a response from a device it delays sending more to that device but does check periodically in case it’s been connected.
If a device is connected, the remote may send up a follow up packet in another cycle to the device. For example there are 4 specific packets sent to a connected AGS and 3 for PT100. Unfortunately these additional packets are not sent consistently so this software, which only captures packets periodically, cannot capture all packets. But most packets that contain status data is sent often enough to be useful.
Fields sent
NOTE: Many PT100 fields may be wrong. This is a work in progress.
DEVICE |
Field Name |
Type |
Comment |
INVERTER |
revision |
text |
|
INVERTER |
mode |
Integer |
|
INVERTER |
mode_text |
Text |
|
INVERTER |
fault |
Integer |
|
INVERTER |
fault_text |
Text |
|
INVERTER |
vdc |
Float |
Volts DC - not accurate according to ME |
INVERTER |
adc |
Float |
Amps DC |
INVERTER |
VACout |
Float |
Volts AC Out |
INVERTER |
VACin |
Float |
Volts AC in - peak to peak, not RMS |
INVERTER |
invled |
Integer |
inverter on if 1 |
INVERTER |
invled_text |
Text |
|
INVERTER |
chgled |
Integer |
charger on if 1 |
INVERTER |
chgled_text |
Text |
|
INVERTER |
bat |
Float |
Battery temperature - only positive |
INVERTER |
tfmr |
Float |
Transformer Temperature |
INVERTER |
fet |
Float |
FET Temperature |
INVERTER |
model |
Integer |
|
INVERTER |
model_text |
Text |
|
INVERTER |
stackmode |
Integer |
|
INVERTER |
stackmode_text |
Text |
|
INVERTER |
AACin |
Float |
Amps AC in |
INVERTER |
AACout |
Float |
Amps AC out |
INVERTER |
Hz |
Float |
|
REMOTE |
revision |
Text |
|
REMOTE |
searchwatts |
Integer |
|
REMOTE |
batterysize |
Integer |
|
REMOTE |
battype |
Integer |
|
REMOTE |
absorb |
Integer |
|
REMOTE |
chargeramps |
Integer |
|
REMOTE |
ainput |
Integer |
|
REMOTE |
parallel |
Integer |
|
REMOTE |
lbco |
Float |
Low Battery cut off |
REMOTE |
vaccutout |
Float |
|
REMOTE |
vsfloat |
Float |
|
REMOTE |
vEQ |
Float |
|
REMOTE |
absorbtime |
Float |
|
REMOTE |
end of core info |
||
following only if AGS connected |
|||
REMOTE |
runtime |
Float |
|
REMOTE |
starttemp |
Float |
|
REMOTE |
startvdc |
Float |
|
REMOTE |
quiettime |
Integer |
|
REMOTE |
begintime |
Integer |
|
REMOTE |
stoptime |
Integer |
|
REMOTE |
vdcstop |
Float |
|
REMOTE |
voltstartdelay |
Integer |
|
REMOTE |
voltstopdelay |
Integer |
|
REMOTE |
maxrun |
Integer |
|
REMOTE |
socstart |
Integer |
|
REMOTE |
socstop |
Integer |
|
REMOTE |
ampstart |
Float |
|
REMOTE |
ampsstartdelay |
Integer |
|
REMOTE |
ampstop |
Integer |
|
REMOTE |
ampsstopdelay |
Integer |
|
REMOTE |
quietbegintime |
Integer |
|
REMOTE |
quietendtime |
Integer |
|
REMOTE |
exercisedays |
Integer |
|
REMOTE |
exercisestart |
Integer |
|
REMOTE |
exerciseruntime |
Integer |
|
REMOTE |
topoff |
Integer |
|
REMOTE |
warmup |
Integer |
|
REMOTE |
cool |
Integer |
|
following only if BMK connected |
|||
REMOTE |
batteryefficiency |
Integer |
|
AGS |
revision |
Text |
|
AGS |
status |
Integer |
|
AGS |
status_text |
Text |
|
AGS |
running |
Boolean |
|
AGS |
temp |
Float |
|
AGS |
runtime |
Float |
|
AGS |
gen_last_run |
Integer |
Not reliably reported |
AGS |
last_full_soc |
Integer |
Not reliably reported |
AGS |
gen_total_run |
Integer |
Not reliably reported |
AGS |
vdc |
Float |
|
BMK |
revision |
Text |
|
BMK |
soc |
Integer |
State of Charge |
BMK |
vdc |
Float |
|
BMK |
adc |
Float |
|
BMK |
vmin |
Float |
Min voltage - reset when power applied |
BMK |
vmax |
Float |
Max voltage - reset when power applied |
BMK |
amph |
Float |
Usage in amp hours in batteries - usually negative |
BMK |
amphtrip |
Float |
Resettable amp hours used |
BMK |
amphout |
Float |
lifetime amp hours used |
BMK |
Fault |
Integer |
|
BMK |
Fault_Text |
Text |
|
PT-100 |
revision |
Text |
|
PT-100 |
address |
Integer |
|
PT-100 |
mode |
Integer |
|
PT-100 |
mode_text |
Text |
|
PT-100 |
mode_hex |
Text |
|
PT-100 |
regulation |
Integer |
|
PT-100 |
regulation_text |
Text |
|
PT-100 |
fault |
Integer |
|
PT-100 |
fault_text |
Text |
|
PT-100 |
battery |
Float |
|
PT-100 |
battery_amps |
Float |
|
PT-100 |
pv_voltage |
Float |
|
PT-100 |
charge_time |
Float |
|
PT-100 |
target_battery_voltage |
Float |
|
PT-100 |
relay_state |
Integer |
|
PT-100 |
alarm_state |
Integer |
|
PT-100 |
fan_on |
Integer |
|
PT-100 |
day |
Integer |
|
PT-100 |
battery_temperature |
Float |
|
PT-100 |
inductor_temperature |
Float |
|
PT-100 |
fet_temperature |
Float |
|
PT-100 |
lifetime_kwhrs |
Float |
|
PT-100 |
resettable_kwhrs |
Float |
|
PT-100 |
ground_fault_current |
Float |
|
PT-100 |
nominal_battery_voltage |
Float |
|
PT-100 |
stacker_info |
Integer |
|
PT-100 |
dip_switches |
Text |
|
PT-100 |
model |
Integer |
|
PT-100 |
output_current_rating |
Integer |
|
PT-100 |
input_voltage_rating |
Integer |
SPDX-License-Identifier: BSD-3-Clause