Setup guides → Anything else

Anything else

There will always be more inverters than adapters — obscure brands, old firmware, hybrid setups, somebody's Victron. Rather than turn you away, send the readings yourself. A shell script, a Home Assistant automation, a Node-RED flow or a cron job is enough, and everything downstream works identically.

Proven in the field

Feeding the author's own site continuously since July 2026.

How freshAs fast as you send
Works withAnything that can make an HTTP request
Setup timeAn afternoon

The endpoint

POST https://api.sunplug.app/ingest/site
Authorization: Bearer <your API key>
Content-Type: application/json

{
  "tsms": 1785759034000,
  "production_kw": 4.2,
  "net_import_kw": -3.1,
  "consumption_kw": 1.1,
  "battery_discharge_kw": 0.0,
  "battery_soc": 0.62
}

Your key is in the app under Settings → Equipment → Anything else.

The fields

tsmsWhen the reading was taken, milliseconds since 1970
production_kwSolar generation. Always positive
net_import_kwGrid. Positive importing, negative exporting
consumption_kwWhole house, including car charging
battery_discharge_kwPositive discharging, negative charging. Optional
battery_socA fraction — 0.62 for 62%. Optional

The one thing to get right

Export must be negative. Everything balances: consumption = production + net_import + battery_discharge. Get the grid sign backwards and Sunplug will believe you are importing 3 kW on a sunny afternoon and refuse to charge — with no error, because each number is individually plausible.

If you can only measure two of the three, send those and leave the third out; it will be derived. Sending a wrong third value is worse than sending none.

An example

curl -sS -X POST https://api.sunplug.app/ingest/site \
  -H "Authorization: Bearer $SUNPLUG_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{\"tsms\": $(($(date +%s) * 1000)),
       \"production_kw\": 4.2,
       \"net_import_kw\": -3.1,
       \"consumption_kw\": 1.1}"

How often

As often as you can, up to about every five seconds. Faster data directly improves tracking — every thirty seconds versus every five minutes is the difference between following a cloud edge and reacting to it. There is no penalty for duplicates or slightly out-of-order readings.

Coming from another service?

The field names, units and sign conventions here are deliberately close to what other solar-charging services accept, so a bridge you already wrote should be a change of URL rather than a rewrite.

Checking it works

The dashboard shows a data age beside the live figures; it should settle to whatever interval you are sending at. If it climbs, your posts are failing — read the response body rather than the status code, since a rejection names the offending field.

Written one of these? Tell me — I would rather ship an adapter than have you maintain a script.