Zero kW is an OpenADR VTN and it ships a VEN you can run on your own site. Between them they reach thermostats, building management systems, lighting, batteries, inverters, EV charging and anything that speaks BACnet or Modbus — which, in a commercial building, is nearly everything.
One event model, four wire formats. A utility on 2.0b, an aggregator on 3.0 and a legacy controller on 2.0a can all be served the same dispatch, and each gets it in the form it understands.
| Profile | Transport | Signals | Reports | Auth | Endpoint |
|---|---|---|---|---|---|
| OpenADR 2.0a | OASIS EI, XML | level only | no | HTTP Basic over TLS | https://mail.zerokw.com/oadr.php/OpenADR2/Simple/2.0a |
| OpenADR 2.0b | OASIS EI, XML | level, price, kW, limit, state of charge | yes | HTTP Basic over TLS | https://mail.zerokw.com/oadr.php/OpenADR2/Simple/2.0b |
| OpenADR 3.0 | REST / JSON | level, price, kW, limit, state of charge | yes | OAuth2 client credentials | https://mail.zerokw.com/oadr.php/openadr3/3.0.1 |
| Signal | Units | 2.0a/2.0b | 3.0 | What it is for |
|---|---|---|---|---|
| Simple level | — | simple / level |
SIMPLE |
Normal / moderate / high / special. Understood by every device that speaks OpenADR at all. |
| Price | USD/kWh | ELECTRICITY_PRICE / price |
PRICE |
The actual $/kWh for the interval. Drives arbitrage and price-responsive setpoints. |
| Dispatch to kW | KW | LOAD_DISPATCH / setpoint |
DISPATCH_SETPOINT |
Hold total load at this kW. The instruction a battery or a chiller plant can act on directly. |
| Shed kW | KW | LOAD_DISPATCH / delta |
DISPATCH_SETPOINT_RELATIVE |
Reduce by this many kW from baseline. What most capacity programs settle against. |
| Capacity limit | KW | LOAD_CONTROL / x-loadControlCapacity |
IMPORT_CAPACITY_LIMIT |
A hard ceiling on import. This is the one that protects a demand charge and a ratchet. |
| State of charge | PERCENT | LOAD_DISPATCH / setpoint |
CHARGE_STATE_SETPOINT |
Target state of charge. Used to pre-charge a battery before a peak or a price spike. |
Profile A carries only the level. A price or a kW target addressed to a 2.0a device is converted to a level and the original instruction is written into the event comment, so an operator reading the exchange can see what was actually meant.
What could you actually shed?
Count what you have. The figures are per unit for a residential site and come from the same model the dispatch page bills against, so this is an estimate of controllable load, not a brochure number.
A driver ships in the exported VEN and speaks this device's protocol. Local/on-premises protocols are exercised against simulators, not against every listed product — the protocol is implemented, the specific model is not certified.
The largest addressable residential load and the fastest commercial one. Setpoint offsets are reversible, cheap and invisible for short events.
| Device | Reached by | Auth | Typical shed | How it is curtailed |
|---|---|---|---|---|
|
Google Nest
driver ships
Google ·
nest_sdm
Setpoint offset
Eco mode
Reads state
Device Access needs a one-off Google project registration fee. Worth saying to a customer before they hit it.
|
https://smartdevicemanagement.googleapis.com/v1 vendor cloud
|
oauth2
|
1.1 kW | SetCool at the offset setpoint. |
|
Honeywell Home / Resideo
driver ships
Resideo ·
resideo
Setpoint offset
Temporary hold
Reads state
|
https://api.honeywell.com/v2 vendor cloud
|
oauth2
|
1.1 kW | changeableValues.coolSetpoint with thermostatSetpointStatus TemporaryHold. |
|
ecobee
driver ships
ecobee (Generac) ·
ecobee
Setpoint offset
Temporary hold
Occupancy
Runtime telemetry
Runtime telemetry is reported in five-minute intervals, which is enough to evidence a shed without a separate meter.
|
https://api.ecobee.com/1 vendor cloud
|
oauth2
|
1.2 kW | setHold with a cooling setpoint offset sized to the level. |
|
Emerson Sensi
roadmap
Emerson
Setpoint offset
|
— vendor cloud
|
partner
No public API. Emerson runs a utility/DR partner program; access is a commercial agreement, not a signup.
|
— | Through the partner DR endpoint. |
|
tado°
roadmap
tado GmbH
Setpoint offset
Reads state
|
https://my.tado.com/api/v2 vendor cloud
|
oauth2
|
— | PUT zone overlay with the offset setpoint. |
Dimming to 80% is unnoticeable and instant. Small per fixture, large per campus, and it never has a comfort complaint.
| Device | Reached by | Auth | Typical shed | How it is curtailed |
|---|---|---|---|---|
|
Lutron (Vive, Caséta Pro, Athena)
driver ships
Lutron Electronics ·
lutron_leap
Dimming
Reads state
Per-zone
Lighting is the least-complained-about curtailment there is, and it responds in under a second.
|
LEAP over TLS, port 8081 on site
|
mtls
LEAP uses a client certificate paired once with the bridge or hub.
|
18 kW | GoToLevel at the computed dim percentage. |
The only asset that can both remove load and add generation. Precharge before a peak, discharge through it.
| Device | Reached by | Auth | Typical shed | How it is curtailed |
|---|---|---|---|---|
|
Tesla Powerwall (local gateway)
driver ships
Tesla ·
tesla_powerwall
Meters itself
State of charge
Battery dispatch
Reserve control
Discharge on demand
The local gateway is preferred over the Fleet API: no cloud round trip, no rate limit, and it keeps working when the internet does not.
|
https://{gateway}/api on site
|
basic
|
5.0 kW | Lower the backup reserve so the Powerwall discharges into the site load through the event. |
|
sonnen (sonnenBatterie)
driver ships
sonnen GmbH ·
sonnen
Meters itself
State of charge
Battery dispatch
Discharge on demand
|
http://{ip}:80/api/v2 on site
|
api_key
Auth-Token header, read from the battery's own web UI.
|
4.6 kW | Manual operating mode, then a discharge setpoint in watts. |
|
FranklinWH aPower
roadmap
FranklinWH
Meters itself
State of charge
Battery dispatch
|
https://energy.franklinwh.com/api vendor cloud
|
bearer
|
— | Time-of-use and reserve settings through the cloud API. |
|
Generac PWRcell
roadmap
Generac
Meters itself
State of charge
Battery dispatch
|
Modbus TCP 502 on site
|
none
Modbus TCP on the PWRcell inverter.
|
— | Reachable through the Modbus driver with the PWRcell register map. |
|
Tesla Fleet API (energy sites, vehicles)
roadmap
Tesla
Meters itself
State of charge
Reserve control
Vehicle Charge Limit
Vehicle Charge Amps
|
https://fleet-api.prd.na.vn.cloud.tesla.com/api/1 vendor cloud
|
oauth2
Partner registration and a hosted public key are prerequisites.
|
— | backup_reserve_percent on an energy site; set_charging_amps on a vehicle. |
Curtailment, power factor and, under IEEE 1547-2018, dispatchable reactive support.
| Device | Reached by | Auth | Typical shed | How it is curtailed |
|---|---|---|---|---|
|
Enphase IQ Gateway (local)
driver ships
Enphase Energy ·
enphase_envoy
Meters itself
State of charge
Metering at 1-second resolution locally, which is the best baseline evidence any residential site will have.
|
https://{envoy} on site
|
bearer
A token from entrez.enphaseenergy.com, exchanged once and cached; the gateway itself validates it.
|
— | Read-only locally. Storage control needs the cloud API or a grid profile change. |
|
Fronius
driver ships
Fronius International ·
sunspec
Meters itself
Percentage curtailment
|
Modbus TCP 502, SunSpec on site
|
none
|
— | SunSpec 123 over Modbus; the Solar API is read-only. |
|
SolarEdge
driver ships
SolarEdge ·
sunspec
Meters itself
Percentage curtailment
Battery dispatch
Modbus TCP must be enabled on the inverter's SetApp site-communication screen; it is off by default.
|
https://monitoringapi.solaredge.com either
|
api_key
Monitoring API key for cloud reads; local SunSpec Modbus needs no key and is where control lives.
|
— | SunSpec model 123 over local Modbus. The cloud monitoring API is read-only. |
|
Enphase Energy API v4
roadmap
Enphase Energy
Meters itself
State of charge
Battery dispatch
Rate-limited by plan tier. Use the local gateway for telemetry and the cloud only for control.
|
https://api.enphaseenergy.com/api/v4 vendor cloud
|
oauth2
|
— | Battery profile and reserve through the systems endpoint. |
Large, deferrable and increasingly the biggest single load at a site. Smart charging profiles are the standard lever.
| Device | Reached by | Auth | Typical shed | How it is curtailed |
|---|---|---|---|---|
|
OCPP 1.6J / 2.0.1 (EV charging)
driver ships
Open Charge Alliance ·
ocpp
Meters itself
Hard kW limit
Deferrable
EV load is the most deferrable thing at most sites and the least noticed when deferred.
|
OCPP over WebSocket at the charger; this driver calls the CSMS REST façade on site
|
bearer
Against the CSMS, not the charger. The charger trusts its CSMS; we talk to that.
|
7.7 kW | SetChargingProfile, TxDefaultProfile, chargingRateUnit W, limit set to the allocation. |
|
Enel X JuiceBox
roadmap
Enel X Way
Meters itself
Hard kW limit
Enel X Way withdrew from North America in 2024; existing units run on third-party clouds. Confirm what a site is actually pointed at before promising control.
|
https://jbv1-api.emotorwerks.com/box_pin vendor cloud
|
api_key
|
— | Set the charging current cap. |
|
Wallbox
roadmap
Wallbox N.V.
Meters itself
Hard kW limit
Session control
|
https://api.wall-box.com vendor cloud
|
bearer
|
— | maxChargingCurrent on the charger. |
A thermal battery that already exists. CTA-2045 makes it dispatchable without touching the tank.
| Device | Reached by | Auth | Typical shed | How it is curtailed |
|---|---|---|---|---|
|
CTA-2045-B module (water heaters, HVAC)
roadmap
ANSI/CTA standard
Native shed command
Pre-load
Reads state
Every major US water heater brand ships a CTA-2045 port. It is the cheapest residential kW on the market and it needs a serial adapter, not an integration.
|
CTA-2045-B over the UCM serial port on site
|
none
|
4.5 kW | Shed for the event duration. |
Not controllable, but the measurement that makes everything else settleable.
| Device | Reached by | Auth | Typical shed | How it is curtailed |
|---|---|---|---|---|
|
Shelly (Pro EM, Plus series)
driver ships
Allterco ·
rest_generic
Meters itself
On/off
|
http://{ip}/rpc on site
|
none
Optional local basic auth.
|
— | Switch the circuit off for the event window — appropriate for a discrete load, never for anything with a compressor. |
|
Emporia Vue / EV charger
roadmap
Emporia Energy
Meters itself
Per-circuit metering
Hard kW limit
The cheapest way to get circuit-level residential telemetry, which is what makes a residential baseline defensible.
|
https://api.emporiaenergy.com vendor cloud
|
bearer
AWS Cognito.
|
— | Charger current cap; the Vue itself is measurement only. |
|
Green Button Connect My Data
roadmap
utility
Interval history
Already wired into the platform's rebate and program matching — see the Green Button flags on the programs page.
|
ESPI / Atom XML vendor cloud
|
oauth2
Per-utility authorization server; the customer authorizes their own data.
|
— | Not controllable. This is where the baseline comes from. |
Generic transports. When a device is not named here, it usually still speaks one of these.
| Device | Reached by | Auth | Typical shed | How it is curtailed |
|---|---|---|---|---|
|
Generic webhook
driver ships
any ·
rest_generic
Setpoint control
Hard kW limit
The escape hatch. A site with a bespoke control system can act on a dispatch in an afternoon without waiting for a driver.
|
HTTPS POST of the dispatch as JSON vendor cloud
|
bearer
|
— | POST {action, level, kw, event} to the configured URL. |
|
Local script
driver ships
any ·
script
Setpoint control
Hard kW limit
For the site that already has automation and only needs to be told when.
|
Executes a configured command with the dispatch in the environment on site
|
none
|
— | Runs the configured command with ZK_ACTION, ZK_LEVEL, ZK_KW and ZK_EVENT_ID set. |
|
Modbus TCP (any device)
driver ships
Modbus Organization ·
modbus_tcp
Meters itself
Setpoint control
Hard kW limit
Register maps are per-product and are configured, not guessed. The driver refuses to write a register it has no map entry for.
|
Modbus TCP, port 502 on site
|
none
No authentication in the protocol. Segment the network.
|
— | Write the kW limit to a configured holding register, scaled per the register map. |
|
SunSpec Modbus (inverters, meters, storage)
driver ships
SunSpec Alliance ·
sunspec
Meters itself
Percentage curtailment
Power factor
Battery dispatch
This is the reason a fleet of mixed inverters is tractable at all: one control path for every conformant device.
|
Modbus TCP 502, SunSpec model discovery from base 40000 on site
|
none
|
— | Model 123 WMaxLimPct plus WMaxLim_Ena — the vendor-neutral way to curtail any conformant inverter. |
|
IEEE 2030.5 / CSIP (Rule 21, HECO)
roadmap
IEEE / SunSpec CSIP
Percentage curtailment
Power factor
Volt-VAR
Battery dispatch
Mandatory for utility DER programs in California and Hawaii. Worth building the moment a customer has a Rule 21 obligation — it is a different trust model, not a different protocol shape.
|
IEEE 2030.5 over HTTPS, XML/EXI vendor cloud
|
mtls
Client certificate from a CSIP-approved PKI. There is no password path.
|
— | DERControl with opModMaxLimW for the event window. |
Two drivers cover the rest. rest_generic posts the dispatch to a URL you control;
script runs a command with the dispatch in its environment. Either takes an
afternoon at a site that already has a way to control itself, and neither waits on us.
And if a device on the roadmap is the one you have, say so from the connect page — that is what moves it up the list.
- None of these integrations has been exercised against physical hardware from this codebase. Treat first deployment at any site as a commissioning exercise: dry-run mode first, then one device, then the fleet.
- This VEN is not OpenADR Alliance certified. It implements the profiles; certification is a separate paid process. If a utility program requires a certified VEN, tell us before enrolling.
- Typical shed figures are order-of-magnitude, from the device class rather than from your building. The real number comes out of your own interval data within a month of the agent reporting, and that is the number we put in a proposal.