Skip to main content

Carbon Aware CLI

The CLI is best for use with systems you can not change the code in but can invoke command line. For example - build pipelines.

The CLI exposes the primary getEmissionsByLocationsAndTime SDK methods via command line and outputs the results as json to stdout.

You can use the CLI via a docker image.

Build and Install

Build the CLI using the dotnet publish command:

dotnet publish ./src/CarbonAware.CLI/src/CarbonAware.CLI.csproj -c Release -o <your desired installation path>

By default this will build for your host operating system. To build for a platform other than your host platform you can specify the target runtime like this, using any valid Runtime ID (EG win-x64, linux-x64, osx-x64):

dotnet publish .\src\CarbonAware.CLI\src\CarbonAware.CLI.csproj -c Release -r <RuntimeID> --self-contained -o <your desired installation path>

Using the CLI

To use the CLI for the first time, navigate to your installation directory and run the binary with the -h flag to see the help menu.

On Windows:

.\caw.exe -h

On MacOS/Linux:

./caw -h

emissions

Description

Retrieve emissions data from specified locations and time periods.

Usage

caw emissions [options]

Options

  -l, --location <location> (REQUIRED)  A named location
  -s, --start-time <startTime>          Start time of emissions data
  -e, --end-time <endTime>              End time of emissions data
  -b, --best                            Filter results down to the best (typically lowest) data point.
  -a, --average                         Outputs the weighted average of all data points within the start and end time boundaries.
  -?, -h, --help                        Show help and usage information

Examples

Single Location Emissions

command:

.\caw.exe emissions -l eastus

output:

[
  {
    "Location": "eastus",
    "Time": "2022-08-30T12:45:11+00:00",
    "Rating": 65,
    "Duration": "08:00:00"
  },
  {
    "Location": "eastus",
    "Time": "2022-08-30T20:45:11+00:00",
    "Rating": 65,
    "Duration": "08:00:00"
  },
  // ...
  {
    "Location": "eastus",
    "Time": "2022-09-06T04:45:11+00:00",
    "Rating": 73,
    "Duration": "08:00:00"
  },
  {
    "Location": "eastus",
    "Time": "2022-09-06T12:45:11+00:00",
    "Rating": 84,
    "Duration": "08:00:00"
  }
]

Multiple Location Emissions

command:

./caw emissions -l eastus -l westus

output:

[
  {
    "Location": "eastus",
    "Time": "2022-08-30T12:45:11+00:00",
    "Rating": 65,
    "Duration": "08:00:00"
  },
  {
    "Location": "eastus",
    "Time": "2022-08-30T20:45:11+00:00",
    "Rating": 65,
    "Duration": "08:00:00"
  },
  // ...
  {
    "Location": "westus",
    "Time": "2022-09-06T04:45:11+00:00",
    "Rating": 73,
    "Duration": "08:00:00"
  },
  {
    "Location": "westus",
    "Time": "2022-09-06T12:45:11+00:00",
    "Rating": 84,
    "Duration": "08:00:00"
  }
]

Emissions with Start and End Times

command:

./caw emissions -l eastus --start-time 2022-07-01T00:00:00Z --end-time 2022-07-31T23:59:59Z --best

output:

[
  {
    "Location": "eastus",
    "Time": "2022-07-01T04:45:11+00:00",
    "Rating": 65,
    "Duration": "08:00:00"
  },
  {
    "Location": "eastus",
    "Time": "2022-07-01T12:45:11+00:00",
    "Rating": 65,
    "Duration": "08:00:00"
  },
  // ...
  {
    "Location": "eastus",
    "Time": "2022-07-31T12:45:11+00:00",
    "Rating": 73,
    "Duration": "08:00:00"
  },
  {
    "Location": "eastus",
    "Time": "2022-07-31T20:45:11+00:00",
    "Rating": 84,
    "Duration": "08:00:00"
  }
]

Best Emissions

command:

./caw emissions -l eastus -l westus --start-time 2022-07-01T00:00:00Z --end-time 2022-07-31T23:59:59Z --best

output:

[
  {
    "Location": "eastus",
    "Time": "2022-07-08T04:45:11+00:00",
    "Rating": 48,
    "Duration": "08:00:00"
  }
]

Average Emissions

command:

./caw emissions -l eastus -l westus --start-time 2022-07-09T00:00:00Z --end-time 2022-07-09T12:00:00Z --average

output:

[
  {
    "Location": "eastus",
    "Time": "2022-07-09T00:00:00+00:00",
    "Rating": 79.357,
    "Duration": "12:00:00"
  },
  {
    "Location": "westus",
    "Time": "2022-07-09T00:00:00+00:00",
    "Rating": 86.91243,
    "Duration": "12:00:00"
  }
]

emissions-forecasts

Description

Forecasted emissions

Usage

caw emissions-forecasts [options]

Options

  -l, --location <location> (REQUIRED)  A list of locations
  --data-start-at <startTime>           Filter out forecasted data points before start at time.
  --data-end-at <endTime>               Filter out forecasted data points after end at time.
  -w, --window-size <INT>                   The estimated duration (in minutes) of the workload being forecasted. Defaults to the duration of a single forecast data point
  --requested-at                        Datetime of a previously generated forecast.  Returns the most current forecast if not provided.
  -?, -h, --help                        Show help and usage information

Examples

Single Location Current Forecast

command:

./caw emissions-forecasts -l northeurope

output:

[{
  "requestedAt": "2022-07-19T13:37:49+00:00",
  "generatedAt": "2022-07-19T13:35:00+00:00",
  "location": "northeurope",
  "dataStartAt": "2022-07-19T14:00:00Z",
  "dataEndAt": "2022-07-20T04:38:00Z",
  "windowSize": 5,
  "optimalDataPoint": {
    "location": "IE",
    "timestamp": "2022-07-19T18:45:00+00:00",
    "duration": 5,
    "value": 448.4451043375
  },
  "forecastData": [
    {
      "location": "IE",
      "timestamp": "2022-07-19T14:00:00+00:00",
      "duration": 5,
      "value": 532.02293146
    },
    ...
    {
      "location": "IE",
      "timestamp": "2022-07-20T04:30:00+00:00",
      "duration": 5,
      "value": 535.7318741001667
    }
  ]
}]

Multiple Location Current Forecasts

command:

./caw emissions-forecasts -l eastus -l westus

output:

[
  {
    "requestedAt": "2022-06-01T12:01:00+00:00"
    "generatedAt": "2022-06-01T12:00:00+00:00",
    "optimalDataPoint": {
      "location": "PJM_ROANOKE",
      "timestamp": "2022-06-01T16:45:00+00:00",
      "duration": 5,
      "value": 448.4451043375
    },
    "forecastData": [ ... ] // all relevant forecast data points
    "location": "eastus",
    "dataStartAt": "2022-06-01T14:05:00+00:00",
    "dataEndAt": "2022-06-02T14:00:00+00:00",
    "windowSize": 5,
  },
  {
    "requestedAt": "2022-06-01T12:01:00+00:00"
    "generatedAt": "2022-06-01T12:00:00+00:00",
    "optimalDataPoint": {
      "location": "CAISO_NORTH",
      "timestamp": "2022-06-13T09:25:00+00:00",
      "duration": 5,
      "value": 328.178478
    },
    "forecastData": [ ... ] // all relevant forecast data points
    "location": "westus",
    "dataStartAt": "2022-06-01T14:05:00+00:00",
    "dataEndAt": "2022-06-02T14:00:00+00:00",
    "windowSize": 5,
  }
]

Filtered Data and Window Size Forecast

Note: For current forecasts, since the data filters must fall within the forecasted data points, it is advisable to create them dynamically.

Example command:

TIME_TWO_HOURS_FROM_NOW=$(date --date='2 hours' --utc --iso-8601='seconds')

TIME_NINETEEN_HOURS_FROM_NOW=$(date --date='19 hours' --utc --iso-8601='seconds')

./caw emissions-forecasts -l northeurope -l westus --data-start-at TIME_TWO_HOURS_FROM_NOW --data-end-at TIME_NINETEEN_HOURS_FROM_NOW -w 10

Example output:

[{
  "requestedAt": "2022-07-19T13:37:49+00:00",
  "generatedAt": "2022-07-19T13:35:00+00:00",
  "location": "northeurope",
  "dataStartAt": "2022-07-19T15:37:49+00:00",
  "dataEndAt": "2022-07-20T08:37:49+00:00",
  "windowSize": 10,
  "optimalDataPoint": {
    "location": "IE",
    "timestamp": "2022-07-19T18:45:00+00:00",
    "duration": 10,
    "value": 448.4451043375
  },
  "forecastData": [
    {
      "location": "IE",
      "timestamp": "2022-07-19T15:40:00+00:00",
      "duration": 10,
      "value": 532.02293146
    },
    ...
    {
      "location": "IE",
      "timestamp": "2022-07-20T08:30:00+00:00",
      "duration": 10,
      "value": 535.7318741001667
    }
  ]
},
{
  "requestedAt": "2022-07-19T13:37:49+00:00",
  "generatedAt": "2022-07-19T13:35:00+00:00",
  "location": "westus",
  "dataStartAt": "2022-07-19T15:37:49+00:00",
  "dataEndAt": "2022-07-20T08:37:49+00:00",
  "windowSize": 10,
  "optimalDataPoint": {
    "location": "CAISO_NORTH",
    "timestamp": "2022-07-19T18:45:00+00:00",
    "duration": 10,
    "value": 502.02293146
  },
  "forecastData": [
    {
      "location": "CAISO_NORTH",
      "timestamp": "2022-07-19T15:40:00+00:00",
      "duration": 10,
      "value": 612.9132146
    },
    ...
    {
      "location": "CAISO_NORTH",
      "timestamp": "2022-07-20T08:30:00+00:00",
      "duration": 10,
      "value": 523.172030157
    }
  ]
}]

Historical Forecast

command:

./caw emissions-forecasts -l northeurope -l westus --requested-at 2022-06-15T18:31:00Z

output:

[{
  "requestedAt": "2022-06-15T18:31:00+00:00",
  "generatedAt": "2022-06-15T18:30:00+00:00",
  "location": "northeurope",
  "dataStartAt": "2022-06-15T18:35:00+00:00",
  "dataEndAt": "2022-06-16T18:30:00+00:00",
  "windowSize": 5,
  "optimalDataPoint": {
    "location": "IE",
    "timestamp": "2022-06-15T23:40:00+00:00",
    "duration": 5,
    "value": 448.4451043375
  },
  "forecastData": [
    {
      "location": "IE",
      "timestamp": "2022-06-15T18:35:00+00:00",
      "duration": 5,
      "value": 532.02293146
    },
    ...
    {
      "location": "IE",
      "timestamp": "2022-06-16T18:25:00+00:00",
      "duration": 5,
      "value": 535.7318741001667
    }
  ]
},
{
  "requestedAt": "2022-06-15T18:31:00+00:00",
  "generatedAt": "2022-06-15T18:30:00+00:00",
  "location": "westus",
  "dataStartAt": "2022-06-15T18:35:00+00:00",
  "dataEndAt": "2022-06-16T18:30:00+00:00",
  "windowSize": 5,
  "optimalDataPoint": {
    "location": "CAISO_NORTH",
    "timestamp": "2022-06-15T23:40:00+00:00",
    "duration": 5,
    "value": 423.4451043375
  },
  "forecastData": [
    {
      "location": "CAISO_NORTH",
      "timestamp": "2022-06-15T18:35:00+00:00",
      "duration": 5,
      "value": 482.02293146
    },
    ...
    {
      "location": "CAISO_NORTH",
      "timestamp": "2022-06-16T18:25:00+00:00",
      "duration": 5,
      "value": 576.7318741008
    }
  ]
}]
Locations

command: ./caw locations

output:

{
  "eastus": {
    "Latitude": 37.3719,
    "Longitude": -79.8164,
    "Name": "eastus"
  },
  ...
  "switzerlandnorth":{
    "Latitude": 47.451542,
    "Longitude": 8.564572,
    "Name": "switzerlandnorth"
  },
  ...
}