Skip to content

Commit

Permalink
Support co2_aoer in WattTime
Browse files Browse the repository at this point in the history
Signed-off-by: Yasumasa Suenaga <[email protected]>
  • Loading branch information
YaSuenag committed Jan 31, 2025
1 parent a9412ac commit 6c51473
Show file tree
Hide file tree
Showing 8 changed files with 46 additions and 22 deletions.
18 changes: 17 additions & 1 deletion casdk-docs/docs/tutorial-extras/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
- [baseUrl](#baseurl)
- [Proxy](#proxy)
- [WattTime Caching BalancingAuthority](#watttime-caching-balancingauthority)
- [SignalType](#signaltype)
- [Json Configuration](#json-configuration)
- [ElectricityMaps Configuration](#electricitymaps-configuration)
- [API Token Header](#api-token-header)
Expand Down Expand Up @@ -111,7 +112,8 @@ data provider must also be supplied.
"url": "http://10.10.10.1",
"username": "proxyUsername",
"password": "proxyPassword"
}
},
"SignalType": "co2_aoer"
},
"ElectricityMaps": {
"Type": "ElectricityMaps",
Expand Down Expand Up @@ -187,6 +189,20 @@ recommends not caching for longer than 1 month.
DataSources__Configurations__WattTime__BalancingAuthorityCacheTTL="90"
```

#### SignalType

WattTime supports 2 signal type. They can be set as a parameter.

* `co2_moer`: Marginal operating emissions rate
* `co2_aoer`: Average operating emissions rate

If values other than these are set, an error occurs.
See [WattTime documentation](https://watttime.org/data-science/data-signals/) for details.

```bash
DataSources__Configurations__WattTime__SignalType=co2_aoer
```

### Json Configuration

By setting
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ public async Task<GridEmissionsDataResponse> GetDataAsync(string regionAbbreviat
{ QueryStrings.Region, regionAbbreviation },
{ QueryStrings.StartTime, startTime.ToUniversalTime().ToString("O", CultureInfo.InvariantCulture) },
{ QueryStrings.EndTime, endTime.ToUniversalTime().ToString("O", CultureInfo.InvariantCulture) },
{ QueryStrings.SignalType, SignalTypes.co2_moer},
{ QueryStrings.SignalType, _configuration.SignalType.ToString()},
};

var tags = new Dictionary<string, string>()
Expand Down Expand Up @@ -93,7 +93,7 @@ public async Task<ForecastEmissionsDataResponse> GetCurrentForecastAsync(string
var parameters = new Dictionary<string, string>()
{
{ QueryStrings.Region, region },
{ QueryStrings.SignalType, SignalTypes.co2_moer }
{ QueryStrings.SignalType, _configuration.SignalType.ToString() }
};

var tags = new Dictionary<string, string>()
Expand Down Expand Up @@ -124,7 +124,7 @@ public Task<ForecastEmissionsDataResponse> GetCurrentForecastAsync(RegionRespons
{ QueryStrings.Region, region },
{ QueryStrings.StartTime, requestedAt.ToUniversalTime().ToString("O", CultureInfo.InvariantCulture) },
{ QueryStrings.EndTime, requestedAt.ToUniversalTime().ToString("O", CultureInfo.InvariantCulture) },
{ QueryStrings.SignalType, SignalTypes.co2_moer }
{ QueryStrings.SignalType, _configuration.SignalType.ToString() }
};

var tags = new Dictionary<string, string>()
Expand Down Expand Up @@ -302,14 +302,14 @@ private async Task<RegionResponse> GetRegionFromCacheAsync(string latitude, stri
{
{ QueryStrings.Latitude, latitude },
{ QueryStrings.Longitude, longitude },
{ QueryStrings.SignalType, SignalTypes.co2_moer}
{ QueryStrings.SignalType, _configuration.SignalType.ToString()}
};

var tags = new Dictionary<string, string>()
{
{ QueryStrings.Latitude, latitude },
{ QueryStrings.Longitude, longitude },
{ QueryStrings.SignalType, SignalTypes.co2_moer }
{ QueryStrings.SignalType, _configuration.SignalType.ToString() }
};
var result = await this.MakeRequestGetStreamAsync(Paths.RegionFromLocation, parameters, tags);
var regionResponse = await JsonSerializer.DeserializeAsync<RegionResponse>(result, _options) ?? throw new WattTimeClientException($"Error getting Region for latitude {latitude} and longitude {longitude}");
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using CarbonAware.Configuration;
using CarbonAware.DataSources.WattTime.Client;
using CarbonAware.DataSources.WattTime.Constants;
using CarbonAware.Exceptions;
using CarbonAware.Interfaces;
using Microsoft.Extensions.Configuration;
Expand All @@ -24,7 +25,7 @@ public static IServiceCollection AddWattTimeEmissionsDataSource(this IServiceCol
services.TryAddSingleton<IEmissionsDataSource, WattTimeDataSource>();
return services;
}

private static void AddDependencies(IServiceCollection services, IConfigurationSection configSection)
{
AddWattTimeClient(services, configSection);
Expand All @@ -33,10 +34,10 @@ private static void AddDependencies(IServiceCollection services, IConfigurationS

private static void AddWattTimeClient(IServiceCollection services, IConfigurationSection configSection)
{
services.Configure<WattTimeClientConfiguration>(c =>
{
configSection.Bind(c);
});
services.AddOptions<WattTimeClientConfiguration>()
.Bind(configSection)
.Validate(config => Enum.IsDefined(typeof(SignalTypes), config.SignalType), "Invalid SignalType")
.ValidateOnStart();

var httpClientBuilder = services.AddHttpClient<WattTimeClient>(IWattTimeClient.NamedClient);
var authenticationClientBuilder = services.AddHttpClient<WattTimeClient>(IWattTimeClient.NamedAuthenticationClient);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using CarbonAware.DataSources.WattTime.Constants;
using CarbonAware.Exceptions;
using System.Text;

Expand Down Expand Up @@ -25,6 +26,11 @@ internal class WattTimeClientConfiguration
/// </summary>
public string BaseUrl { get; set; } = "https://api.watttime.org/v3/";

/// <summary>
/// Gets or sets the signal type to use: co2_moer or co2_aoer
/// </summary>
public SignalTypes SignalType { get; set; } = SignalTypes.co2_moer;

/// <summary>
/// Authentication base url. This changed between v2 and v3
/// to be different to the API base url.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
namespace CarbonAware.DataSources.WattTime.Constants;

internal class SignalTypes
internal enum SignalTypes
{
public const string co2_moer = "co2_moer";
co2_moer,
co2_aoer
}
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,7 @@ public async Task GetRegionAsync_DeserializesExpectedResponse()
Assert.IsNotNull(regionResponse);
Assert.AreEqual(WattTimeTestData.Constants.Region, regionResponse?.Region);
Assert.AreEqual(WattTimeTestData.Constants.RegionFullName, regionResponse?.RegionFullName);
Assert.AreEqual(SignalTypes.co2_moer, regionResponse?.SignalType);
Assert.AreEqual(SignalTypes.co2_moer.ToString(), regionResponse?.SignalType);
}

[Test]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public class Constants
public static DateTime Date = new DateTime(2099, 1, 1, 0, 0, 0);
public const float Value = 999.99f;
public const string Version = "1.0";
public const string SignalType = SignalTypes.co2_moer;
public const string SignalType = "co2_moer";
public const int Frequency = 300;
}

Expand Down Expand Up @@ -46,10 +46,10 @@ private static GridEmissionsMetaData _GetGridDataMetaResponse()
Model = new GridEmissionsModelData()
{
Date = Constants.Date,
Type = SignalTypes.co2_moer
Type = "co2_moer"
},
DataPointPeriodSeconds = 30,
SignalType = SignalTypes.co2_moer,
SignalType = "co2_moer",
Units = "co2_moer"
};

Expand Down Expand Up @@ -122,7 +122,7 @@ private static RegionResponse _GetRegion()
{
Region = Constants.Region,
RegionFullName = Constants.RegionFullName,
SignalType = SignalTypes.co2_moer
SignalType = "co2_moer"
};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public void Setup()
this.DataSource = new WattTimeDataSource(this.Logger.Object, this.WattTimeClient.Object, this.LocationSource.Object);

this.DefaultLocation = new Location() { Name = "eastus" };
this.DefaultRegion = new RegionResponse() { Region = "TEST_REGION", RegionFullName = "Test Region Full Name", SignalType = SignalTypes.co2_moer };
this.DefaultRegion = new RegionResponse() { Region = "TEST_REGION", RegionFullName = "Test Region Full Name", SignalType = "co2_moer" };
this.DefaultDataStartTime = new DateTimeOffset(2022, 4, 18, 12, 32, 42, TimeSpan.FromHours(-6));
MockRegionLocationMapping();
}
Expand Down Expand Up @@ -297,7 +297,7 @@ private GridEmissionsDataResponse GenerateGridEmissionsResponse(int numberOfData
var meta = new GridEmissionsMetaData()
{
Region = this.DefaultRegion.Region,
SignalType = SignalTypes.co2_moer
SignalType = "co2_moer"
};

var response = new GridEmissionsDataResponse()
Expand All @@ -315,7 +315,7 @@ private HistoricalForecastEmissionsDataResponse GenerateHistoricalForecastRespon
var meta = new GridEmissionsMetaData()
{
Region = this.DefaultRegion.Region,
SignalType = SignalTypes.co2_moer
SignalType = "co2_moer"
};

var response = new HistoricalForecastEmissionsDataResponse()
Expand All @@ -340,7 +340,7 @@ private ForecastEmissionsDataResponse GenerateForecastResponse(int numberOfDatap
var meta = new GridEmissionsMetaData()
{
Region = this.DefaultRegion.Region,
SignalType = SignalTypes.co2_moer
SignalType = "co2_moer"
};

var response = new ForecastEmissionsDataResponse()
Expand Down

0 comments on commit 6c51473

Please sign in to comment.