protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { try { var latest = await OctopusStoreService.ReadLastPriceEntryAsync(); await ProcessNewerValues(latest, stoppingToken); } catch (Exception ex) when(!stoppingToken.IsCancellationRequested) { Logger.LogWarning(ex, "Error in price service: {Exception}", ex.Message); } await Task.Delay(TimeSpan.FromHours(1), stoppingToken); } }
private async Task ProcessNewerValues(OctopusPriceEntry?latest, CancellationToken ct) { Instant requestTime; IReadOnlyList <OctopusConsumptionEntry> consumptionEntries; if (latest == null) { var flux = $@" from(bucket: ""{Bucket}"") |> range(start: -12mo) |> filter(fn: (r) => r._measurement == ""Consumption"") |> pivot( rowKey:[""_time""], columnKey: [""_field""], valueColumn: ""_value"" )"; consumptionEntries = await OctopusStoreService.QueryAsync <OctopusConsumptionEntry>(flux); if (consumptionEntries.Count == 0) { requestTime = Instant.FromUtc(2020, 1, 1, 0, 0); } else { requestTime = consumptionEntries[0].Time.Plus(Duration.FromMinutes(30)); } } else { requestTime = latest.Time.Plus(Duration.FromMinutes(30)); var flux = $@" from(bucket: ""{Bucket}"") |> range(start: {requestTime}) |> filter(fn: (r) => r._measurement == ""Consumption"") |> pivot( rowKey:[""_time""], columnKey: [""_field""], valueColumn: ""_value"" )"; consumptionEntries = await OctopusStoreService.QueryAsync <OctopusConsumptionEntry>(flux); } if (consumptionEntries.Count > 0) { var tariffEntries = await QueryTarrifEntries(requestTime); Logger.LogInformation("Got {Count} tariff entries from {First} to {Last} - requested = {Request}", tariffEntries.Count, tariffEntries[0], tariffEntries[^ 1], requestTime);
public OctopusTariffService(ILogger<OctopusTariffService> logger, OctopusService octopusService, OctopusStoreService octopusStoreService) { Logger = logger; OctopusService = octopusService; OctopusStoreService = octopusStoreService; }
public OctopusPriceService(ILogger <OctopusPriceService> logger, OctopusStoreService octopusStoreService, IOptions <InfluxDbService.Config> influxConfigOptions) { Logger = logger; OctopusStoreService = octopusStoreService; Bucket = influxConfigOptions.Value.Bucket; }
public OctopusConsumptionService(ILogger <OctopusConsumptionService> logger, OctopusService octopusService, OctopusStoreService octopusStoreService) { Logger = logger; OctopusService = octopusService; OctopusStoreService = octopusStoreService; }