Integrator guide changelog
This page tracks what changed in the integrator guide and the integrator checklist, so you can tell at a glance whether anything you built against has moved since you last read it.
It records content changes: new requirements, changed thresholds and cadences, clarified behaviour, and corrections. Restructuring, renamed headings, link fixes, and wording polish are not listed, because they do not change what an EMS has to do.
Entries are dated by the day the change was published to this site. Where a change also moved the protocol version, the version is named and links to the corresponding protocol version changelog entry, which carries the schema-level detail.
2026-08-18b
No protocol change.
- Scheduling and submission. New sections at the end of the FCR pre-qualification page: how the test day is arranged with the area TSO, the obligations on the day, and what is submitted afterwards on Form 19-1 to 19-4.
- Offered capacity is the bid cap. New section stating that the confirmed value becomes the upper bidding limit: the largest output change within 30 seconds on a 0.2 Hz drop, 0.3 Hz in Hokkaido.
- Duration is not assessed. Now stated explicitly.
- Droop ceiling has an exception. The 5 % ceiling now notes that the area TSO may permit otherwise where equipment characteristics justify it.
- Base frequency section reworked. The deadband ceilings are now given directly, ±0.01 Hz at 50 Hz and ±0.012 Hz at 60 Hz, rather than derived. The 50 Hz staircase remains a scaled proposal pending area TSO confirmation, and the Hokkaido 0.3 Hz threshold is cited as proof that test a thresholds are not frequency-scaled.
- Workbook. The instruction sheet now says to start recording at least one hour before the assessment window. The English workbook's prose no longer carries untranslated Japanese terms.
2026-08-18
No protocol change.
- New page: FCR pre-qualification. What the 事前審査 test actually consists of: the two standardized tests, the frequency patterns for test a and test b, the criteria applied to the response, the requirements verified (deadband, droop, response time, measurement interval, delay time), and how the 50 Hz and 60 Hz cases differ. Includes downloadable mock frequency workbooks for the engineer operating the transducer. The guide's own pre-qualification section is unchanged in substance and now links to it.
- Pre-qualification testing. Now states explicitly that the section covers only what the EMS publishes during a test, and points to the new page for the test procedure itself.
2026-08-17
Published with protocol 2.8.0, which adds batched telemetry. That entry carries the payload contract; below is what moved in this guide.
- New section: Batched telemetry. The two batch topics, a worked payload, the rules for forming a batch, and a live-versus-backfill table. Batching is granted per site and is backfill-only by default, so confirm the mode with your technical contact before switching.
- Quality of service. The QoS 0-or-1 latitude no longer applies everywhere: batch topics require QoS 1 and must not set RETAIN. Now also states that PUBACK is broker receipt, not ingestion.
- Broker rate limits. Added the per-connection publish rate (100/second, excess discarded rather than queued), throughput cap (512 KB/second) and 256-byte topic-name limit, a backfill pacing target of 50 publishes/second and 256 KB/second, and a note that AWS meters in 5 KB increments counting the topic name.
- Error codes. The
DUPLICATEentry no longer reads "message with same id sent twice". - FCR Assessment II reporting. Now distinguishes its 1 Hz measurement requirement from arrival latency.
2026-08-13
Published with protocol 2.7.0.
- Command validation is all-or-nothing. New section. If any item in
control.schedulefails validation, the EMS applies none of the items in that command, including the valid ones, and continues executing the previously valid schedule. This covers power setpoint and FCR commands, and FCRaction: "cancel"as well asaction: "execute".errors[]must carry one entry per invalid item rather than stopping at the first. This was previously undefined; an EMS that applied the valid part of a mixed command now needs to change. - New
GRID_OTHERalert code for AC-side grid faults that no existing code covers: loss of the grid connection, a protection relay or grid-interconnection breaker trip, an out-of-tolerance voltage or frequency condition at the connection point, or a site-wide outage the EMS can still report. These previously had to be reported asUNKNOWN_FAULT. - One fault may raise several alert codes. New section. On a DC-linked system, a fault in hardware shared by the PV array and the battery is reported as both
PV_OTHERandBATT_OTHER. Where the EMS reaches both subsystems through a single collector device and has no per-BMS or per-PVPCS visibility, raisingBATT_COMM_FAILandPV_COMM_FAILsimultaneously on loss of communication with that collector is acceptable. alertStateis published even when nothing is firing. With no active alerts, publish the snapshot with an emptymeasurement_valuearray on the normal schedule rather than suppressing it. Without the empty snapshot, a healthy site is indistinguishable from an EMS that has stopped reporting.- Setpoints now say where they apply. New section, and the change most likely to need code. Each
BatteryPowerCommandinterval carriesreference_point:"battery"(the value refers to the battery, generation flows through untouched) or"grid"(the value refers to the metering point, and the battery absorbs whatever is generated). Omitting it means"battery", so nothing you have already built changes meaning, andpower_kw = 0still means the battery stands by. What changes is that the point is now stated rather than inferred: an EMS must read the field instead of deciding from its own topology, and DC-coupled systems honour"battery"by compensating their inverter setpoint against measured PV. You will not receive"grid"until your EMS reportsschema_version2.7.0. - Unreachable setpoints have defined behaviour for the first time. New schedule interpretation rule 9 and a new
SETPOINT_UNREACHABLEalert code. If you cannot deliver a commanded value — an inverter limit on a"battery"interval, a state-of-energy limit on a"grid"one — clamp to the closest achievable value, keep running, and raise the alert. Do not reject the command and do not stop the battery. Previously the spec said nothing about this case at all. - Command validation rules gained three entries that
AR-15andFC-10depend on and that the list did not previously carry: inverted or empty intervals (start_ts >= end_ts), out-of-rangepower_kw/capacity_kw, andcapacity_kwon the wrong FCR action. These were already reachable through the error codes reference; they are now in the normative must-reject list. - Curtailment is required for every topology, including stand-alone. The metric table row is unchanged at 🔴 Required, but the schema previously called the message optional, so integrators reading the spec rather than the guide may have treated it as opt-in. It is required. The stand-alone section now says so explicitly: a battery with no co-located solar can still sit behind TSO output control. Irradiation remains not required for stand-alone.
- Mocked-broker testing now names the mixed valid/invalid schedule among the error paths to cover.
- New integrator checklist items
A-5,A-6,AR-15,AR-16,AR-17,FC-10. - Wire
schema_versionmoved to2.7.0. - This page was added.
2026-08-12
- Before commands can reach you. New section. Commands are published only for a battery that exists as an asset in a Tensor Cloud workspace and is associated with your EMS gateway. Until Tensor Energy has registered that asset and created the association, your command subscription is connected but silent, and every checklist item that depends on receiving a command is blocked. Telemetry is unaffected and starts flowing as soon as the certificate connects.
- Testing error paths with a mocked broker. New section. Tensor Cloud only ever emits valid commands and your gateway certificate cannot publish on
cmd/..., so the error paths of your command handling cannot be exercised against the test server at all. The section recommends covering them with unit and integration tests against a mocked MQTT broker, injecting at the MQTT boundary, and lists the cases to cover. The integrator checklist now marks which items this applies to in a Verification column.
2026-07-28
Published with protocol 2.6.1.
measurement_tson windowed measurements. New section. On any measurement covering a period of time,measurement_tsalways carries the start of that period, never its end or midpoint: it equalsmeasurement_value.start_tson windowed energy, and the start ofaggregation_windowon power and grid frequency sent withaggregation: "average". Point-in-time telemetry is unchanged.- Curtailment
measurement_tsis the schedule's TSO-issued creation time when the TSO data carries it, otherwise the time the EMS received the schedule. The periods the schedule covers remain inmeasurement_value[].start_tsandend_ts. - Added a sequence diagram of the alert message flow.
2026-07-14
Published with protocol 2.6.0.
- Solar DC voltage and current for DC-linked systems. New requirement. DC-link PV plus battery sites publish the PV array's DC voltage (V) and current (A) on
dt/{siteId}/{gatewayId}/solar, measured at the DC link upstream of the inverter as a single value aggregated across the whole array, sampled at the same instant and sent as one matched pair at 1-minute resolution. AC-linked and stand-alone sites do not send this channel. - Missing-data guidance extended: if either half of the voltage/current pair cannot be read at a timestamp, skip the publish for that timestamp rather than sending one value alone.
- Wire
schema_versionmoved to2.6.0.
2026-07-10
Published with protocol 2.5.0.
- Telemetry that cannot be parsed is now acknowledged. The feedback carries
correlation_id: "unknown",code: "MESSAGE_MALFORMED", and atopicfield naming the channel it arrived on. Do not assumecorrelation_idalways matches themsg_UUID pattern. - The error-surfaces reference now documents
detail,field_path, andtopiconTelemetryFeedback, and states thattopicis the only identifier available whencorrelation_idis the sentinel. - Wire
schema_versionmoved to2.5.0.
2026-07-07
Two changes published the same day.
- FCR is dispatched in 30-minute slots, not 3-hour blocks. Corrected in the FCR offer schedule and Assessment II sections.
- Power sign convention stated explicitly: positive = charging, negative = discharging,
0= standby. The command topic does not encode direction, so the sign ofpower_kwis authoritative. - A higher
prioritynumber wins. The direction was previously left to inference. - The acknowledgement must be sent immediately after receiving and parsing a command; this was previously "should". The curtailment merge of TSO fixed and update schedules likewise became "must".
res_topicis authoritative for where the response goes; the AsyncAPI channel addressack-cmd/{siteId}is illustrative. Application-level acknowledgements are required regardless of the MQTT QoS in use.- Message envelope essentials. New section covering the
message_idformat and its reuse on resend,schema_version, the+09:00timezone convention, the{window}token enum (PT1M,PT5M,PT10M,PT15M,PT30M,PT1H), and forward compatibility with unknown fields. - Broker rate limits. New section with the AWS IoT Core quotas an EMS actually meets: 100 in-flight publishes per connection, 128 KB payload, per-account publish rate, 8 subscriptions per SUBSCRIBE, one CONNECT per second per client ID.
- Telemetry that is required only under a stated condition is now marked 🟡 Conditional rather than ⚪️ Optional, with a legend. The affected metrics are
grid_to_load_ac,load_demand_ac,grid_to_battery_ac,inverter_net_output_ac,inverter_to_load_ac, andgrid_to_inverter_ac. - Added a terminology table, and the list of telemetry topics that use a fixed tail instead of the
{metric}/{type}pattern. - Malformed command acknowledgement. When a command cannot be parsed at all (
MESSAGE_MALFORMED), itsmessage_idcannot be recovered, so set the response'scommand_idto the sentinel string"unknown". If themessage_idis partially recoverable, echo the recovered value. The response's ownmessage_idis always freshly generated.
2026-07-06
Published with protocol 2.4.0.
- Grid frequency telemetry. New requirement for FCR-awarded resources: publish grid frequency at 1 Hz on
dt/{siteId}/{gatewayId}/frequencyfor the full duration of every FCR-awarded slot, measured at the grid connection point from the live AC waveform, reported to at least 0.0001 Hz, as the mean over each 1-second window and time-aligned with the 1 Hz power samples. - Pre-qualification (事前審査) flag. New section. While the EMS operator has the site in pre-qualification test mode, set
pre_qualification: trueon every instantaneous-power and grid-frequency message. Tensor Cloud uses it to exclude the window from optimization and from Assessment II submissions. - Wire
schema_versionmoved to2.4.0.
2026-06-30
- Alert thresholds defined.
BATT_SOC_LOWis state of charge below 3%;BATT_SOH_DEGRADEDis state of health below 80%. Both were previously described only as "below the minimum threshold" and "degraded compared to expected performance". TheBATT_OVERTEMPthreshold is noted as usually defined by the battery OEM. INTERNAL_ERRORand ACK timing (protocol 2.3.1). The acknowledgement reflects validation and acceptance at receipt time, not the execution outcome, and cannot report a failure that surfaces only later at execution.INTERNAL_ERRORalso covers a well-formed command that fails during receipt-time handling and cannot be committed before the ACK is sent.
2026-06-20
- State telemetry. Added as a fourth telemetry data type alongside instantaneous power, windowed energy, and lifetime energy:
dt/{siteId}/{gatewayId}/{metric}/state, required for battery State of Energy (battery_soe). - Curtailment became a required metric, carrying
limit_percentper interval. FCR cancellation requirescapacity_kwto be omitted. - Dynamic updates for aggregated (VPP) resources. The EMS may receive an updated FCR capacity or power baseline for a slot that has already started and must apply it immediately, the same as any other in-progress interval.
2026-06-19
- Corrected the order of operations for FCR Assessment II. Tensor Cloud derives the net measured power, converts it to the sending-end basis including network-loss correction, then subtracts the registered baseline to obtain the supplied power. The earlier text applied the baseline before the sending-end conversion.
2026-06-16
Published with protocol 2.3.0.
- FCR Assessment II reporting. New section. Resources registered as offline-monitored publish 1-second-resolution power for FCR-awarded slots, on the metric set that matches the resource's TSO registration (grid-connection-point or equipment-point). Covers which slots the TSO selects and when, 60-day local retention for that data (longer than the 7 days for general telemetry), and buffering and resend after a connection loss.
2026-05-28
- Missing data policy. New section. If the EMS cannot read a numeric value at a given timestamp, skip the publish for that metric at that timestamp.
value: nullfails schema validation andvalue: 0is indistinguishable from a genuine zero reading. If the underlying resource fails for an extended period, raise an alert. - Curtailment scope. A single publish may cover any time horizon and any number of intervals, bounded only by the 128 KB MQTT payload limit. Where the TSO provides separate fixed and update schedules, the EMS resolves them into a single effective schedule and publishes that.
2026-01-22
Published with protocol 2.1.0.
- Irradiation telemetry. Required for co-located storage (AC-link and DC-link), published to
dt/{siteId}/{gatewayId}/irradiationinkW/m2. Not required for stand-alone batteries.
2026-01-14
- FCR baseline. New section. When the battery is operated in FCR mode, the regular power command determines the baseline that the FCR response is delivered around.
2025-11-03
- Site ID and gateway ID. New section covering what each identifier addresses, and the hot-standby and cold-standby gateway configurations, including that each physical gateway needs its own certificate and that one certificate supports only one concurrent connection.
- Battery capacity metrics. New section.
battery_soemust be calculated againstbattery_energy_remaining(effective capacity), never nominal capacity, andbattery_energy_remainingitself is updated as capacity degrades. - Added the command lifecycle sequence diagram.
2025-10-31
issue_tson command messages. Commands carry the time Tensor Cloud issued them, used to break ties between schedules of equal priority covering the same period.
2025-09-17
- Command response topics updated to the
ack-cmd/{siteId}namespace.