node-red-contrib-apsystems-easypower 0.1.0
Node-RED nodes for the APsystems EasyPower (EZ1) cloud API.
node-red-contrib-apsystems-easypower
Node-RED nodes for the APsystems EasyPower cloud (EZ1 inverters).
Talks to the same encrypted cloud API as the official AP EasyPower mobile app — no local network access to the inverter is required, but a working EasyPower account is.
Inspired by the Home Assistant integration Meyblaubaer/apsystems-easypower-ha.
Nodes
| Node | What it does |
|---|---|
| apsystems-config | Holds username / password. Logs in on demand and re-auths when the token expires. |
| apsystems-inverters | Lists all EZ inverters on the account. Optional fan-out (one msg per inverter). |
| apsystems-realtime | Live AC power per inverter (power, power1, power2 in W). |
| apsystems-statistic | Energy totals: todayEnergy, monthEnergy, lifetimeEnergy (kWh) + lastPower (W). |
| apsystems-status | Communication / running status of the inverter. |
Install
From your Node-RED user directory (usually ~/.node-red):
npm install node-red-contrib-apsystems-easypower
…or, while developing locally:
cd ~/.node-red
npm install /path/to/node-red-contrib-apsystems-easypower
Restart Node-RED. The nodes appear under the APSystems category in the palette.
Quick start
- Drag any data node (e.g.
apsystems-realtime) onto the flow. - Open it, create a new apsystems-config with your EasyPower credentials.
- Trigger the flow with an inject node —
msg.payloadcarries the response.
Typical pattern: poll all inverters
[ inject (every 5 min) ]
│
▼
[ apsystems-inverters (fan-out=on) ]
│ (one msg per inverter, msg.payload = inverter object)
├─────────────► [ apsystems-realtime ] ──► [ debug ]
└─────────────► [ apsystems-statistic ] ──► [ debug ]
The realtime / statistic nodes pick up msg.payload.inverter_dev_id
automatically, so you don't have to wire the device ID yourself.
Don't poll faster than once a minute. The cloud doesn't update faster than that anyway and aggressive polling risks rate-limits or account locks. The Home Assistant integration uses a 5-minute interval; we recommend the same.
Message contract
apsystems-inverters
- Input: any (used as trigger).
- Output (default):
msg.payload= array of inverters. Also setsmsg.systemIdandmsg.systems. - Output (fan-out): one msg per inverter,
msg.payload= single inverter object includinginverter_dev_id.
apsystems-realtime / -statistic / -status
- Device ID is taken from (in order): node setting →
msg.devId→msg.inverter_dev_id→msg.payload.inverter_dev_id. - Output:
msg.payload= response object.msg.devIdandmsg.offlineare set. - When the inverter is offline (cloud code
1001),msg.offline=trueandmsg.payload={}— no error is raised, so a chained statistic node can still report cached lifetime energy if you want it.
Notes & caveats
- TLS: the EasyPower cloud sometimes presents non-standard certificates,
so the config node defaults to
rejectUnauthorized=false. Tick Strict TLS if your environment is happy with strict validation. - App credentials (
API_APP_ID,API_APP_SECRET, RSA public key) are extracted from the EasyPower APK. APsystems may rotate them — if login starts failing across all users, that's the likely cause. - Tested with: EZ1-M-EU (2 channels). Other EZ-series inverters should work, since the API surface is the same.
License
MIT — see LICENSE.