node-red-contrib-dess-monitor 2.1.0
Node-RED palette for DESS/ShinePower solar inverter monitoring via MQTT
node-red-contrib-dess-monitor
A Node-RED palette for monitoring DESS / ShinePower / Growatt solar inverters via the ShinePower cloud API. Publishes clean, structured MQTT topics for every inverter metric — battery, PV, grid, output, and system data.
🔒 Listen-Only by Design — This package intentionally never reads or writes to your inverter EEPROM.
queryDeviceCtrlFieldand all write commands have been permanently removed. Your inverter hardware is safe.
Features
dess-poller— Polls the DESS cloud API on a configurable interval and publishes inverter data as individual MQTT messagesdess-config— Shared credential node (username + password) used by the poller node- Automatic token refresh on expiry — no manual re-authentication needed
- Sanity filtering — drops physically impossible readings before they reach MQTT
- All-zeros guard — detects cloud bridge offline state and suppresses false-zero payloads
- Duplicate slug deduplication — multiple raw API aliases for the same field publish only once
- Field allowlist — configure exactly which fields to publish, ignore the rest
- Supports multiple inverters simultaneously
- Zero EEPROM access — ctrl field polling and all write commands permanently removed
Why No Write Commands?
The queryDeviceCtrlField API call reads from the inverter's EEPROM via the cloud bridge on every single call. EEPROM has a finite read/write cycle life. At a 60-second poll interval that's 1,440 EEPROM accesses per day — accelerating hardware wear and potentially causing inverter faults over time.
This package permanently removes all ctrl field polling and write commands. To change inverter settings, use the DessMonitor app or web.shinemonitor.com directly.
Requirements
- Node-RED
>= 3.0.0 - Node.js
>= 16.0.0 - A DESS / ShinePower / DessMonitor account at dessmonitor.com
- An MQTT broker (e.g. Mosquitto) — nodes output
msgobjects ready for a standard MQTT-out node
Installation
Via Node-RED Palette Manager (recommended)
- Open Node-RED → Menu → Manage Palette → Install
- Search for
node-red-contrib-dess-monitor - Click Install
Via npm
cd ~/.node-red
npm install node-red-contrib-dess-monitor
Then restart Node-RED.
Quick Start
- Drag a
dess-confignode onto the canvas and double-click it - Enter your DessMonitor username (email) and password
- Drag a
dess-pollernode, select your config node, set the base topic and poll interval - Wire Output 1 and Output 2 to MQTT-out nodes
- Deploy — data starts flowing immediately
Nodes
dess-config
Credential config node shared by all DESS nodes.
| Property | Description |
|---|---|
| Username | Your DessMonitor account email |
| Password | Your DessMonitor password (stored securely via Node-RED credentials API) |
| Already hashed | Enable if you are providing a pre-hashed SHA1 password |
dess-poller
Polls the DESS cloud API and emits two output streams.
| Property | Default | Description |
|---|---|---|
| Config node | — | Select your dess-config node |
| Base topic | home/inverters |
MQTT topic prefix |
| Poll interval | 60 s |
How often to query the API (min 10s) |
| Device PNs | (blank = all) | Comma-separated list of inverter PNs to include |
| Include offline | false | Include devices marked offline by the cloud |
| Fetch last data | true | Poll querySPDeviceLastData |
| Last Data Fields | (blank = all) | Comma-separated slug allowlist for last_data output |
| Fetch energy flow | true | Poll webQueryDeviceEnergyFlowEs |
| Energy Flow Fields | (blank = all) | Comma-separated slug allowlist for energy_flow output |
| QoS | 1 |
MQTT QoS level |
| Retain | true | MQTT retain flag |
Outputs:
| Output | Content |
|---|---|
| 1 (top) | Last data metrics — one msg per field |
| 2 (bottom) | Energy flow metrics — one msg per field |
Field Filtering (Allowlist)
By default the poller publishes every field your inverter reports. Use the Fields boxes to limit output to only what you need:
Last Data Fields example:
battery_voltage, battery_capacity, pv_power, pv_voltage, grid_input_voltage, active_load_power, load_percent, inv_temperature, output_priority
Energy Flow Fields example:
pv_total_power, battery_capacity, battery_power, active_load_power, grid_in_power
Leave either box empty to publish all fields for that output. Slug names are case-insensitive and must match the snake_case field names visible in your MQTT topics.
MQTT Topic Structure
<base>/<device_pn>/last_data/<category>/<field_slug>
<base>/<device_pn>/last_data/<category>/<field_slug>/unit
<base>/<device_pn>/energy_flow/<field_slug>
<base>/<device_pn>/energy_flow/<field_slug>/unit
Example topics (base = home/inverters, pn = Q0001)
home/inverters/Q0001/last_data/battery/battery_voltage → 51.2
home/inverters/Q0001/last_data/battery/battery_voltage/unit → V
home/inverters/Q0001/last_data/battery/battery_capacity → 87
home/inverters/Q0001/last_data/pv/pv_power → 1840
home/inverters/Q0001/last_data/pv/pv_voltage → 342.5
home/inverters/Q0001/last_data/grid/grid_input_voltage → 234.1
home/inverters/Q0001/last_data/grid/grid_frequency → 50.02
home/inverters/Q0001/last_data/output/active_load_power → 620
home/inverters/Q0001/last_data/output/load_percent → 31
home/inverters/Q0001/last_data/system/inv_temperature → 42.0
home/inverters/Q0001/last_data/system/output_priority → SBU
home/inverters/Q0001/energy_flow/pv_power → 1840
home/inverters/Q0001/energy_flow/battery_capacity → 87
home/inverters/Q0001/energy_flow/active_load_power → 620
Supported Inverter Brands
Any inverter reporting to the ShinePower / DessMonitor cloud platform:
- EASUN (SMG-II, SMX series)
- VOLTRONIC (Axpert, InfiniSolar)
- Growatt (SPF series)
- PowMr (MPPT hybrid series)
- Must (PH1800, PV series)
- Any OEM rebranded on the ShinePower platform
Flow Context Variables
| Variable | Content |
|---|---|
flow.dess_token |
Current auth token |
flow.dess_secret |
Current auth secret |
flow.dess_devices |
Array of device objects from the API |
flow.dess_read_only |
Always true |
Changelog
1.4.0
- Removed:
dess-ctrlnode entirely — dead code with read-only enforced - Removed:
dess-ctrl.jsanddess-ctrl.htmlfrom package - Updated:
package.jsonnode-red nodes section — onlydess-configanddess-poller - Package now contains exactly 2 nodes, both read-only
1.3.0
- Breaking: Reduced outputs from 3 to 2 — ctrl_fields output permanently removed
- Removed:
queryDeviceCtrlFieldAPI call — zero EEPROM reads from Node-RED - Added: Field allowlist filtering for last_data and energy_flow outputs
- Added:
flow.dess_read_onlyalwaystrue - Node canvas label shows 🔒 listen-only status
1.2.0
- Fixed: Re-authentication on token expiry backs off instead of hammering the API
- Fixed: All-zeros guard no longer false-fires at night
- Fixed: HTTP non-200 responses no longer leak socket connections
- Fixed: Empty device list retries once before giving up
- Fixed: Duplicate slug collision in multi-alias inverter responses
1.1.0
- Added sanity checking (physical limits filter) for all metric fields
- Added all-zeros guard for cloud bridge offline detection
- Added field mapping with clean snake_case MQTT topic names and categories
1.0.0
- Initial release
Credits
This package is a Node-RED implementation inspired by and ported from:
- home-assistant-dess-monitor — API signing, authentication flow, field mapping seed
- home-assistant-dess-monitor-local — Sanity checking logic and all-zeros offline guard
Both projects are MIT licensed. Original authors retain their respective copyrights.
License
MIT © 2026 Nitin ([email protected])
See LICENSE for full text including upstream copyright notices.