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 commercial 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 |
|---|---|---|---|---|
|
Honeywell Home / Resideo
driver ships
Resideo ·
resideo
Setpoint offset
Temporary hold
Reads state
|
https://api.honeywell.com/v2 vendor cloud
|
oauth2
|
3.0 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
|
3.5 kW | setHold with a cooling setpoint offset sized to the level. |
Where a commercial site's real curtailment lives — chillers, AHUs, VAV boxes. One point write moves hundreds of kW.
| Device | Reached by | Auth | Typical shed | How it is curtailed |
|---|---|---|---|---|
|
Tridium Niagara (oBIX)
driver ships
Tridium / Honeywell ·
obix
Meters itself
Setpoint control
Hard kW limit
Point discovery
Niagara sits in front of an enormous installed base of otherwise unreachable equipment. Where a site has a JACE, this is usually the shortest path to every load in the building.
|
https://{host}/obix on site
|
basic
A dedicated oBIX user on the JACE. Do not reuse an operator login.
|
110 kW | POST a real value to the configured writable point. |
|
Carrier / Automated Logic WebCTRL
roadmap
Carrier
Meters itself
Setpoint control
Hard kW limit
Most WebCTRL sites are reachable over BACnet/IP as well, which needs no add-on licence — try that first.
|
https://{host}/_common/webservices on site
|
basic
WebCTRL operator account with the SOAP/REST add-on licensed.
|
90 kW | Write the site's demand-limit microblock input. |
|
Distech Controls / Acuity
roadmap
Acuity Brands
Meters itself
Setpoint control
|
BACnet/IP, or the ECLYPSE REST API on site
|
basic
|
— | Reachable over BACnet/IP — prefer that driver. |
|
Johnson Controls Metasys
roadmap
Johnson Controls
Meters itself
Setpoint control
Hard kW limit
|
https://{host}/api/v4 on site
|
bearer
|
120 kW | PUT presentValue with a priority. |
|
Schneider EcoStruxure Building
roadmap
Schneider Electric
Meters itself
Setpoint control
|
https://{host}/api/v1 on site
|
basic
|
100 kW | PUT the value on the configured point. |
|
Siemens Desigo CC
roadmap
Siemens
Meters itself
Setpoint control
|
https://{host}/api on site
|
bearer
|
120 kW | Command a value on the point with a priority. |
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. |
|
Crestron 4-Series
roadmap
Crestron
Dimming
Per-zone
|
Crestron CWS / CIP on site
|
bearer
CWS API token on the control processor.
|
— | Set the analog join backing the load's dim level. |
|
DALI-2 gateway
roadmap
DiiA standard
Dimming
Reads state
|
DALI-2 via a BACnet or Modbus gateway on site
|
none
|
— | Broadcast ARC power level to the group. Reach it through the gateway's BACnet or Modbus driver. |
|
Enlighted (Siemens)
roadmap
Siemens
Dimming
Meters itself
Occupancy
Enlighted fixtures meter themselves, so a shed is evidenced without a separate meter.
|
https://{tenant}.enlightedinc.com/ems/api vendor cloud
|
bearer
|
22 kW | Apply a dim profile to the selected areas. |
|
Signify Interact Pro
roadmap
Signify (Philips)
Dimming
Reads state
|
https://api.interact-lighting.com vendor cloud
|
oauth2
|
— | Scene or dim level per group. |
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. |
|
Stem Athena
roadmap
Stem Inc.
Meters itself
State of charge
Battery dispatch
|
— vendor cloud
|
bearer
|
250 kW | Stem's own optimizer already targets demand charges — the integration is coordination, not control, and double-dispatch is the risk to design around. |
|
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. |
|
SMA (Sunny Tripower, Data Manager)
driver ships
SMA Solar Technology ·
sunspec
Meters itself
Percentage curtailment
Power factor
|
Modbus TCP 502, SunSpec on site
|
none
Modbus is unauthenticated; the Data Manager web UI is not.
|
— | SunSpec 123 WMaxLimPct. |
|
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.
|
48 kW | SetChargingProfile, TxDefaultProfile, chargingRateUnit W, limit set to the allocation. |
|
ChargePoint
roadmap
ChargePoint
Meters itself
Hard kW limit
Session control
|
SOAP vendor cloud
|
basic
NOS API credentials, issued under a partner agreement.
|
50 kW | shedLoad with an allocation per port or per station group. |
|
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. |
|
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 |
|---|---|---|---|---|
|
BACnet/IP (any device)
driver ships
ASHRAE standard 135 ·
bacnet_ip
Meters itself
Setpoint control
Hard kW limit
BACnet priority
Writing at priority 1-2 outranks life-safety interlocks. This driver refuses any priority below 8 and there is no override.
|
BACnet/IP over UDP 47808 on site
|
none
BACnet/IP has no authentication. Reach it over a management VLAN, never a routable network.
|
60 kW | WriteProperty present-value on the configured analog-value, at priority 8 (Manual Operator). |
|
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. |
|
MQTT / Sparkplug B
roadmap
OASIS / Eclipse
Meters itself
Setpoint control
The usual answer when a site has an industrial historian and no other way in.
|
MQTT 3.1.1 / 5.0, optionally Sparkplug B payloads on site
|
basic
|
— | Publish the setpoint to the configured topic. |
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.