diff --git a/TeslaSolarCharger/Server/ServiceCollectionExtensions.cs b/TeslaSolarCharger/Server/ServiceCollectionExtensions.cs index 34a899711..938317256 100644 --- a/TeslaSolarCharger/Server/ServiceCollectionExtensions.cs +++ b/TeslaSolarCharger/Server/ServiceCollectionExtensions.cs @@ -101,6 +101,7 @@ public static IServiceCollection AddMyDependencies(this IServiceCollection servi .AddTransient() .AddTransient() .AddTransient() + .AddTransient() .AddSharedBackendDependencies(); if (useFleetApi) { diff --git a/TeslaSolarCharger/Server/Services/GridPrice/Contracts/IOldTscConfigPriceService.cs b/TeslaSolarCharger/Server/Services/GridPrice/Contracts/IOldTscConfigPriceService.cs new file mode 100644 index 000000000..e9ef237d8 --- /dev/null +++ b/TeslaSolarCharger/Server/Services/GridPrice/Contracts/IOldTscConfigPriceService.cs @@ -0,0 +1,7 @@ +using TeslaSolarCharger.Server.Services.GridPrice.Dtos; + +namespace TeslaSolarCharger.Server.Services.GridPrice.Contracts; + +public interface IOldTscConfigPriceService : IPriceDataService +{ +} diff --git a/TeslaSolarCharger/Server/Services/GridPrice/OldTscConfigPriceService.cs b/TeslaSolarCharger/Server/Services/GridPrice/OldTscConfigPriceService.cs new file mode 100644 index 000000000..1e2c0d56f --- /dev/null +++ b/TeslaSolarCharger/Server/Services/GridPrice/OldTscConfigPriceService.cs @@ -0,0 +1,50 @@ +using Microsoft.EntityFrameworkCore; +using TeslaSolarCharger.Model.Contracts; +using TeslaSolarCharger.Server.Services.GridPrice.Contracts; +using TeslaSolarCharger.Server.Services.GridPrice.Dtos; + +namespace TeslaSolarCharger.Server.Services.GridPrice; + +public class OldTscConfigPriceService (ILogger logger, + ITeslaSolarChargerContext teslaSolarChargerContext) : IOldTscConfigPriceService +{ + public async Task> GetPriceData(DateTimeOffset from, DateTimeOffset to, string? configString) + { + logger.LogTrace("{method}({from}, {to}, {configString})", nameof(GetPriceData), from, to, configString); + if (!int.TryParse(configString, out var id)) + { + logger.LogError("Invalid configString: {configString}", configString); + throw new ArgumentException("Invalid configString", nameof(configString)); + } + var price = await teslaSolarChargerContext.ChargePrices.FirstAsync(p => p.Id == id); + if (!price.AddSpotPriceToGridPrice) + { + return new List() + { + new() + { + ValidFrom = from, + ValidTo = to, Value = price.GridPrice, + SolarPrice = price.SolarPrice, + }, + }; + } + var spotPrices = await teslaSolarChargerContext.SpotPrices + .Where(p => p.EndDate >= from && p.StartDate <= to) + .OrderBy(p => p.StartDate) + .ToListAsync(); + var result = new List(); + foreach (var spotPrice in spotPrices) + { + var gridPriceDuringThisSpotPrice = price.GridPrice + spotPrice.Price + spotPrice.Price * price.SpotPriceCorrectionFactor; + result.Add(new Price + { + ValidFrom = new DateTimeOffset(spotPrice.StartDate, TimeSpan.Zero), + ValidTo = new DateTimeOffset(spotPrice.EndDate, TimeSpan.Zero), + Value = gridPriceDuringThisSpotPrice, + SolarPrice = price.SolarPrice, + }); + } + return result; + } +} diff --git a/TeslaSolarCharger/Server/Services/TscOnlyChargingCostService.cs b/TeslaSolarCharger/Server/Services/TscOnlyChargingCostService.cs index 087398e00..2f2236450 100644 --- a/TeslaSolarCharger/Server/Services/TscOnlyChargingCostService.cs +++ b/TeslaSolarCharger/Server/Services/TscOnlyChargingCostService.cs @@ -1,5 +1,4 @@ using Microsoft.EntityFrameworkCore; -using System.Runtime.InteropServices.JavaScript; using TeslaSolarCharger.Model.Contracts; using TeslaSolarCharger.Model.Entities.TeslaSolarCharger; using TeslaSolarCharger.Server.Services.ApiServices.Contracts; @@ -94,6 +93,10 @@ private async Task> GetPricesInTimeSpan(DateTime from, DateTime to) .Where(c => c.ValidSince < from) .OrderByDescending(c => c.ValidSince) .FirstAsync(); + var fromDateTimeOffset = new DateTimeOffset(from, TimeSpan.Zero); + var toDateTimeOffset = new DateTimeOffset(to, TimeSpan.Zero); + IPriceDataService priceDataService; + var prices = new List(); switch (chargePrice.EnergyProvider) { case EnergyProvider.Octopus: @@ -101,9 +104,9 @@ private async Task> GetPricesInTimeSpan(DateTime from, DateTime to) case EnergyProvider.Tibber: break; case EnergyProvider.FixedPrice: - var priceDataService = serviceProvider.GetRequiredService(); - var prices = await priceDataService.GetPriceData(from, to, chargePrice.EnergyProviderConfiguration).ConfigureAwait(false); - return prices.ToList(); + priceDataService = serviceProvider.GetRequiredService(); + prices = (await priceDataService.GetPriceData(fromDateTimeOffset, toDateTimeOffset, chargePrice.EnergyProviderConfiguration).ConfigureAwait(false)).ToList(); + return prices; case EnergyProvider.Awattar: break; case EnergyProvider.Energinet: @@ -111,6 +114,9 @@ private async Task> GetPricesInTimeSpan(DateTime from, DateTime to) case EnergyProvider.HomeAssistant: break; case EnergyProvider.OldTeslaSolarChargerConfig: + priceDataService = serviceProvider.GetRequiredService(); + prices = (await priceDataService.GetPriceData(fromDateTimeOffset, toDateTimeOffset, chargePrice.Id.ToString()).ConfigureAwait(false)).ToList(); + return prices; break; default: throw new ArgumentOutOfRangeException();