curl --request PATCH \
--url https://api.ionworks.com/projects/{project_id}/planned_measurements/{planned_measurement_id} \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"cell_specification_id": "<string>",
"cell_instance_id": "<string>",
"channel_id": "<string>",
"set_temperature_c": 123,
"thermal_chamber_id": "<string>",
"protocol_id": "<string>",
"program_id": "<string>",
"test_setup": {},
"planned_start_time": "2023-11-07T05:31:56Z",
"planned_end_time": "2023-11-07T05:31:56Z",
"estimated_duration_seconds": 2,
"setup_duration_seconds": 1,
"teardown_duration_seconds": 1,
"started_measurement_id": "<string>",
"notes": "<string>"
}
'import requests
url = "https://api.ionworks.com/projects/{project_id}/planned_measurements/{planned_measurement_id}"
payload = {
"name": "<string>",
"cell_specification_id": "<string>",
"cell_instance_id": "<string>",
"channel_id": "<string>",
"set_temperature_c": 123,
"thermal_chamber_id": "<string>",
"protocol_id": "<string>",
"program_id": "<string>",
"test_setup": {},
"planned_start_time": "2023-11-07T05:31:56Z",
"planned_end_time": "2023-11-07T05:31:56Z",
"estimated_duration_seconds": 2,
"setup_duration_seconds": 1,
"teardown_duration_seconds": 1,
"started_measurement_id": "<string>",
"notes": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
cell_specification_id: '<string>',
cell_instance_id: '<string>',
channel_id: '<string>',
set_temperature_c: 123,
thermal_chamber_id: '<string>',
protocol_id: '<string>',
program_id: '<string>',
test_setup: {},
planned_start_time: '2023-11-07T05:31:56Z',
planned_end_time: '2023-11-07T05:31:56Z',
estimated_duration_seconds: 2,
setup_duration_seconds: 1,
teardown_duration_seconds: 1,
started_measurement_id: '<string>',
notes: '<string>'
})
};
fetch('https://api.ionworks.com/projects/{project_id}/planned_measurements/{planned_measurement_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.ionworks.com/projects/{project_id}/planned_measurements/{planned_measurement_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'cell_specification_id' => '<string>',
'cell_instance_id' => '<string>',
'channel_id' => '<string>',
'set_temperature_c' => 123,
'thermal_chamber_id' => '<string>',
'protocol_id' => '<string>',
'program_id' => '<string>',
'test_setup' => [
],
'planned_start_time' => '2023-11-07T05:31:56Z',
'planned_end_time' => '2023-11-07T05:31:56Z',
'estimated_duration_seconds' => 2,
'setup_duration_seconds' => 1,
'teardown_duration_seconds' => 1,
'started_measurement_id' => '<string>',
'notes' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.ionworks.com/projects/{project_id}/planned_measurements/{planned_measurement_id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"cell_specification_id\": \"<string>\",\n \"cell_instance_id\": \"<string>\",\n \"channel_id\": \"<string>\",\n \"set_temperature_c\": 123,\n \"thermal_chamber_id\": \"<string>\",\n \"protocol_id\": \"<string>\",\n \"program_id\": \"<string>\",\n \"test_setup\": {},\n \"planned_start_time\": \"2023-11-07T05:31:56Z\",\n \"planned_end_time\": \"2023-11-07T05:31:56Z\",\n \"estimated_duration_seconds\": 2,\n \"setup_duration_seconds\": 1,\n \"teardown_duration_seconds\": 1,\n \"started_measurement_id\": \"<string>\",\n \"notes\": \"<string>\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.ionworks.com/projects/{project_id}/planned_measurements/{planned_measurement_id}")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"cell_specification_id\": \"<string>\",\n \"cell_instance_id\": \"<string>\",\n \"channel_id\": \"<string>\",\n \"set_temperature_c\": 123,\n \"thermal_chamber_id\": \"<string>\",\n \"protocol_id\": \"<string>\",\n \"program_id\": \"<string>\",\n \"test_setup\": {},\n \"planned_start_time\": \"2023-11-07T05:31:56Z\",\n \"planned_end_time\": \"2023-11-07T05:31:56Z\",\n \"estimated_duration_seconds\": 2,\n \"setup_duration_seconds\": 1,\n \"teardown_duration_seconds\": 1,\n \"started_measurement_id\": \"<string>\",\n \"notes\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ionworks.com/projects/{project_id}/planned_measurements/{planned_measurement_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"cell_specification_id\": \"<string>\",\n \"cell_instance_id\": \"<string>\",\n \"channel_id\": \"<string>\",\n \"set_temperature_c\": 123,\n \"thermal_chamber_id\": \"<string>\",\n \"protocol_id\": \"<string>\",\n \"program_id\": \"<string>\",\n \"test_setup\": {},\n \"planned_start_time\": \"2023-11-07T05:31:56Z\",\n \"planned_end_time\": \"2023-11-07T05:31:56Z\",\n \"estimated_duration_seconds\": 2,\n \"setup_duration_seconds\": 1,\n \"teardown_duration_seconds\": 1,\n \"started_measurement_id\": \"<string>\",\n \"notes\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"name": "<string>",
"id": "<string>",
"organization_id": "<string>",
"project_id": "<string>",
"status": "requested",
"requested_by": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"cell_specification_id": "<string>",
"cell_instance_id": "<string>",
"channel_id": "<string>",
"set_temperature_c": 123,
"thermal_chamber_id": "<string>",
"protocol_id": "<string>",
"program_id": "<string>",
"test_setup": {},
"planned_start_time": "2023-11-07T05:31:56Z",
"planned_end_time": "2023-11-07T05:31:56Z",
"estimated_duration_seconds": 2,
"setup_duration_seconds": 0,
"teardown_duration_seconds": 0,
"notes": "<string>",
"scheduled_by": "<string>",
"scheduled_at": "2023-11-07T05:31:56Z",
"started_measurement_id": "<string>",
"cancelled_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z",
"requested_by_email": "<string>",
"scheduled_by_email": "<string>",
"channel_name": "<string>",
"cycler_id": "<string>",
"cycler_name": "<string>",
"program_name": "<string>",
"estimated_duration_status": "estimating",
"estimated_duration_job_id": "<string>",
"estimated_duration_simulation_id": "<string>",
"simulated_duration_seconds": 123,
"estimated_duration_is_exact": true,
"estimated_duration_margin_pct": 123,
"actual_duration_seconds": 123,
"estimated_duration_note": "<string>",
"estimated_duration_calculated_at": "2023-11-07T05:31:56Z"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Update a planned measurement
Patch a planned measurement.
curl --request PATCH \
--url https://api.ionworks.com/projects/{project_id}/planned_measurements/{planned_measurement_id} \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"cell_specification_id": "<string>",
"cell_instance_id": "<string>",
"channel_id": "<string>",
"set_temperature_c": 123,
"thermal_chamber_id": "<string>",
"protocol_id": "<string>",
"program_id": "<string>",
"test_setup": {},
"planned_start_time": "2023-11-07T05:31:56Z",
"planned_end_time": "2023-11-07T05:31:56Z",
"estimated_duration_seconds": 2,
"setup_duration_seconds": 1,
"teardown_duration_seconds": 1,
"started_measurement_id": "<string>",
"notes": "<string>"
}
'import requests
url = "https://api.ionworks.com/projects/{project_id}/planned_measurements/{planned_measurement_id}"
payload = {
"name": "<string>",
"cell_specification_id": "<string>",
"cell_instance_id": "<string>",
"channel_id": "<string>",
"set_temperature_c": 123,
"thermal_chamber_id": "<string>",
"protocol_id": "<string>",
"program_id": "<string>",
"test_setup": {},
"planned_start_time": "2023-11-07T05:31:56Z",
"planned_end_time": "2023-11-07T05:31:56Z",
"estimated_duration_seconds": 2,
"setup_duration_seconds": 1,
"teardown_duration_seconds": 1,
"started_measurement_id": "<string>",
"notes": "<string>"
}
headers = {"Content-Type": "application/json"}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
cell_specification_id: '<string>',
cell_instance_id: '<string>',
channel_id: '<string>',
set_temperature_c: 123,
thermal_chamber_id: '<string>',
protocol_id: '<string>',
program_id: '<string>',
test_setup: {},
planned_start_time: '2023-11-07T05:31:56Z',
planned_end_time: '2023-11-07T05:31:56Z',
estimated_duration_seconds: 2,
setup_duration_seconds: 1,
teardown_duration_seconds: 1,
started_measurement_id: '<string>',
notes: '<string>'
})
};
fetch('https://api.ionworks.com/projects/{project_id}/planned_measurements/{planned_measurement_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.ionworks.com/projects/{project_id}/planned_measurements/{planned_measurement_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'cell_specification_id' => '<string>',
'cell_instance_id' => '<string>',
'channel_id' => '<string>',
'set_temperature_c' => 123,
'thermal_chamber_id' => '<string>',
'protocol_id' => '<string>',
'program_id' => '<string>',
'test_setup' => [
],
'planned_start_time' => '2023-11-07T05:31:56Z',
'planned_end_time' => '2023-11-07T05:31:56Z',
'estimated_duration_seconds' => 2,
'setup_duration_seconds' => 1,
'teardown_duration_seconds' => 1,
'started_measurement_id' => '<string>',
'notes' => '<string>'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.ionworks.com/projects/{project_id}/planned_measurements/{planned_measurement_id}"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"cell_specification_id\": \"<string>\",\n \"cell_instance_id\": \"<string>\",\n \"channel_id\": \"<string>\",\n \"set_temperature_c\": 123,\n \"thermal_chamber_id\": \"<string>\",\n \"protocol_id\": \"<string>\",\n \"program_id\": \"<string>\",\n \"test_setup\": {},\n \"planned_start_time\": \"2023-11-07T05:31:56Z\",\n \"planned_end_time\": \"2023-11-07T05:31:56Z\",\n \"estimated_duration_seconds\": 2,\n \"setup_duration_seconds\": 1,\n \"teardown_duration_seconds\": 1,\n \"started_measurement_id\": \"<string>\",\n \"notes\": \"<string>\"\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.ionworks.com/projects/{project_id}/planned_measurements/{planned_measurement_id}")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"cell_specification_id\": \"<string>\",\n \"cell_instance_id\": \"<string>\",\n \"channel_id\": \"<string>\",\n \"set_temperature_c\": 123,\n \"thermal_chamber_id\": \"<string>\",\n \"protocol_id\": \"<string>\",\n \"program_id\": \"<string>\",\n \"test_setup\": {},\n \"planned_start_time\": \"2023-11-07T05:31:56Z\",\n \"planned_end_time\": \"2023-11-07T05:31:56Z\",\n \"estimated_duration_seconds\": 2,\n \"setup_duration_seconds\": 1,\n \"teardown_duration_seconds\": 1,\n \"started_measurement_id\": \"<string>\",\n \"notes\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.ionworks.com/projects/{project_id}/planned_measurements/{planned_measurement_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"cell_specification_id\": \"<string>\",\n \"cell_instance_id\": \"<string>\",\n \"channel_id\": \"<string>\",\n \"set_temperature_c\": 123,\n \"thermal_chamber_id\": \"<string>\",\n \"protocol_id\": \"<string>\",\n \"program_id\": \"<string>\",\n \"test_setup\": {},\n \"planned_start_time\": \"2023-11-07T05:31:56Z\",\n \"planned_end_time\": \"2023-11-07T05:31:56Z\",\n \"estimated_duration_seconds\": 2,\n \"setup_duration_seconds\": 1,\n \"teardown_duration_seconds\": 1,\n \"started_measurement_id\": \"<string>\",\n \"notes\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"name": "<string>",
"id": "<string>",
"organization_id": "<string>",
"project_id": "<string>",
"status": "requested",
"requested_by": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"cell_specification_id": "<string>",
"cell_instance_id": "<string>",
"channel_id": "<string>",
"set_temperature_c": 123,
"thermal_chamber_id": "<string>",
"protocol_id": "<string>",
"program_id": "<string>",
"test_setup": {},
"planned_start_time": "2023-11-07T05:31:56Z",
"planned_end_time": "2023-11-07T05:31:56Z",
"estimated_duration_seconds": 2,
"setup_duration_seconds": 0,
"teardown_duration_seconds": 0,
"notes": "<string>",
"scheduled_by": "<string>",
"scheduled_at": "2023-11-07T05:31:56Z",
"started_measurement_id": "<string>",
"cancelled_at": "2023-11-07T05:31:56Z",
"completed_at": "2023-11-07T05:31:56Z",
"requested_by_email": "<string>",
"scheduled_by_email": "<string>",
"channel_name": "<string>",
"cycler_id": "<string>",
"cycler_name": "<string>",
"program_name": "<string>",
"estimated_duration_status": "estimating",
"estimated_duration_job_id": "<string>",
"estimated_duration_simulation_id": "<string>",
"simulated_duration_seconds": 123,
"estimated_duration_is_exact": true,
"estimated_duration_margin_pct": 123,
"actual_duration_seconds": 123,
"estimated_duration_note": "<string>",
"estimated_duration_calculated_at": "2023-11-07T05:31:56Z"
}{
"detail": [
{
"loc": [
"<string>"
],
"msg": "<string>",
"type": "<string>",
"input": "<unknown>",
"ctx": {}
}
]
}Body
Request model for patching a planned measurement.
set_temperature_c and thermal_chamber_id must end up either both
set or both unset, but this model cannot check that alone: a body sending
only one of them has nothing to compare against, and the other may already be
stored. The service validates the merged result against the stored row, and
the database CHECK backstops it — the same split used for the thermal
chamber's min/max envelope.
1 - 255Lifecycle state for a planned measurement.
requested, scheduled, in_progress, completed, cancelled x >= 1x >= 0x >= 0Response
Successful Response
A planned measurement row returned by the API.
1 - 255Lifecycle state for a planned measurement.
requested, scheduled, in_progress, completed, cancelled Cell specification the requester wants tested (set at request time).
Cell instance this future measurement will run on.
Channel reserved for this measurement, once scheduled.
Temperature this test must run at, in degrees Celsius, held fixed for the whole test. None means ambient: the test runs outside a thermal chamber.
Chamber this test's channel sits in for the reservation. Recorded per reservation rather than per channel, because channels move between chambers.
Named protocol (experiment_template) this measurement will run. Required on create; a planned measurement must name a protocol.
Optional catalog program (Formation, Cycling, …) for this test request.
Planned physical setup.
When setup/run is planned to start.
When this planned measurement is expected to release the channel.
Expected run duration before scheduled times exist.
x >= 1Operator setup duration before the test starts.
x >= 0Operator teardown duration after the test finishes.
x >= 0Free-text planning notes.
Lifecycle of a duration estimate computed by a background simulation.
Used by both estimates: a planned test's total duration
(planned_measurements.estimated_duration_*) and a running test's
remaining duration (cell_measurements.estimated_end_time_*). One enum
because the lifecycle is identical -- only what is being estimated differs.
estimating while the job is in flight, ready once a value came from
it, failed with the reason in the accompanying note. None means no
estimate was ever requested.
estimating, ready, failed Was this page helpful?