diff --git a/.vscode/launch.json b/.vscode/launch.json index ff8d11d..cb7ea23 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -14,7 +14,7 @@ "args": [], "cwd": "${workspaceFolder}/HeatOptimiser", // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console - "console": "internalConsole", + "console": "externalTerminal", "stopAtEntry": false }, { diff --git a/HeatOptimiser.Tests/AssetManagerTest.cs b/HeatOptimiser.Tests/AssetManagerTest.cs index 7ed7cf6..f8090b4 100644 --- a/HeatOptimiser.Tests/AssetManagerTest.cs +++ b/HeatOptimiser.Tests/AssetManagerTest.cs @@ -66,11 +66,10 @@ public void TestAssetManagerLoadAndSaveUnits() { // Arrange AssetManager.AddUnit("Unit 1", "image1.jpg", 10.5, 20.5, 30.5, 40.5, 50.5); - AssetManager.SaveUnits(AssetManager.GetAllUnits(), "TestUnits.json"); + AssetManager.SaveUnits(AssetManager.GetAllUnits()); // Act - AssetManager.LoadUnits("TestUnits.json"); - var units = AssetManager.GetAllUnits(); + ObservableCollection units = AssetManager.LoadUnits(); // Assert Assert.NotNull(units); @@ -85,16 +84,5 @@ public void TestAssetManagerLoadAndSaveUnits() AssetManager.DeleteUnit(AssetManager.GetAllUnits()[0].ID); } - [Fact] - public void TestAssetManagerSetSaveFile() - { - // Act - AssetManager.SetSaveFile("TestUnits.json"); - var saveFileName = AssetManager.saveFileName; - - // Assert - Assert.NotNull(saveFileName); - Assert.Equal("TestUnits.json", saveFileName); - } } } \ No newline at end of file diff --git a/HeatOptimiser.Tests/SourceDataManagerTest.cs b/HeatOptimiser.Tests/SourceDataManagerTest.cs index 37cb3a6..648edbd 100644 --- a/HeatOptimiser.Tests/SourceDataManagerTest.cs +++ b/HeatOptimiser.Tests/SourceDataManagerTest.cs @@ -1,4 +1,5 @@ using Xunit; +using System.Collections.ObjectModel; namespace HeatOptimiser.Tests { @@ -15,7 +16,7 @@ public void TestLoadXLSXFile() Console.WriteLine(file); // Act - var result = SourceDataManager.LoadXLSXFile(file, 4, 2); + var result = SourceDataManager.LoadXLSXFile(file, 2, 4); // Assert Assert.NotNull(result); @@ -27,7 +28,7 @@ public void TestGetDataInRange() { // Arrange SourceData data = new SourceData(); - data.LoadedData = new List(); // Initialize LoadedData + data.LoadedData = new ObservableCollection(); // Initialize LoadedData DateTime startDate = new DateTime(2023, 1, 1); DateTime endDate = new DateTime(2023, 1, 31); diff --git a/HeatOptimiser/Assets/800px-Danfoss-Logo.svg.png b/HeatOptimiser/Assets/800px-Danfoss-Logo.svg.png new file mode 100644 index 0000000..69c0668 Binary files /dev/null and b/HeatOptimiser/Assets/800px-Danfoss-Logo.svg.png differ diff --git a/HeatOptimiser/Classes/AssetManager.cs b/HeatOptimiser/Classes/AssetManager.cs index 2d7ca6a..cf20f46 100644 --- a/HeatOptimiser/Classes/AssetManager.cs +++ b/HeatOptimiser/Classes/AssetManager.cs @@ -71,12 +71,17 @@ public bool IsSelected get => _isSelected; set => this.RaiseAndSetIfChanged(ref _isSelected, value); } + public bool _optimiseSelected; + public bool OptimiseSelected + { + get => _optimiseSelected; + set => this.RaiseAndSetIfChanged(ref _optimiseSelected, value); + } } public static class AssetManager { - public static string saveFileName = "ProductionAssets.json"; public static ObservableCollection _productionAssets = new ObservableCollection(); - private static JsonAssetStorage _jsonAssetStorage = new JsonAssetStorage(); + private static JsonAssetStorage _jsonAssetStorage = new JsonAssetStorage("ProductionAssets.json"); public static void AddUnit(string name, string image, double heat, double electricity, double energy, double cost, double carbonDioxide) { if (name != null && image != null && !string.IsNullOrWhiteSpace(name) && !string.IsNullOrWhiteSpace(image)) @@ -90,9 +95,10 @@ public static void AddUnit(string name, string image, double heat, double electr Energy = energy, Cost = cost, CarbonDioxide = carbonDioxide, - IsSelected = false + IsSelected = false, + OptimiseSelected = false }); - _jsonAssetStorage.SaveUnits(_productionAssets, saveFileName); // this is up for debate, I just want to auto save, and they likely wont have thousands of production units, that could cause a performance issue. + _jsonAssetStorage.SaveUnits(_productionAssets); // this is up for debate, I just want to auto save, and they likely wont have thousands of production units, that could cause a performance issue. } else { @@ -102,7 +108,7 @@ public static void AddUnit(string name, string image, double heat, double electr public static void DeleteUnit(Guid ID) { _productionAssets.Remove(_productionAssets.FirstOrDefault(x => x.ID == ID)!); - _jsonAssetStorage.SaveUnits(_productionAssets, saveFileName); // this is also up for debate, just like on AddUnit. + _jsonAssetStorage.SaveUnits(_productionAssets); // this is also up for debate, just like on AddUnit. } public static void EditUnit(Guid ID, int index, string stringValue) { @@ -117,7 +123,7 @@ public static void EditUnit(Guid ID, int index, string stringValue) default: throw new ArgumentOutOfRangeException("Index out of range or wrong type used"); } - _jsonAssetStorage.SaveUnits(_productionAssets, saveFileName); // this is also up for debate, just like on AddUnit. + _jsonAssetStorage.SaveUnits(_productionAssets); // this is also up for debate, just like on AddUnit. } public static void EditUnit(Guid ID, int index, double doubleValue) { @@ -141,20 +147,27 @@ public static void EditUnit(Guid ID, int index, double doubleValue) default: throw new ArgumentOutOfRangeException("Index out of range or wrong type used"); } - _jsonAssetStorage.SaveUnits(_productionAssets, saveFileName); // this is also up for debate, just like on AddUnit. + _jsonAssetStorage.SaveUnits(_productionAssets); // this is also up for debate, just like on AddUnit. } public static ObservableCollection GetAllUnits() { return _productionAssets; } - public static ObservableCollection LoadUnits(string fileName) + public static ObservableCollection GetSelectedUnits() + { + var assets = _productionAssets.Where(x => x._optimiseSelected == true).ToList(); + ObservableCollection selectedAssets = new ObservableCollection(assets); + return selectedAssets; + + } + public static ObservableCollection LoadUnits() { - _productionAssets = _jsonAssetStorage.LoadUnits(fileName); + _productionAssets = _jsonAssetStorage.LoadUnits(); return _productionAssets; } - public static void SaveUnits(ObservableCollection AllAssets, string fileName) + public static void SaveUnits(ObservableCollection AllAssets) { - _jsonAssetStorage.SaveUnits(AllAssets, fileName); + _jsonAssetStorage.SaveUnits(AllAssets); } public static ObservableCollection SearchUnits(string name) { @@ -162,18 +175,19 @@ public static ObservableCollection SearchUnits(string name) ObservableCollection selected = [.. selection]; return selected; } - public static void SetSaveFile(string fileName) - { - saveFileName = fileName; - } } public class JsonAssetStorage { - public ObservableCollection LoadUnits(string fileName) + private string filePath; + public JsonAssetStorage(string passedFilePath) + { + filePath = passedFilePath; + } + public ObservableCollection LoadUnits() { - if (File.Exists(fileName) && new FileInfo(fileName).Length > 2) + if (File.Exists(filePath) && new FileInfo(filePath).Length > 2) { - string jsonString = File.ReadAllText(fileName); + string jsonString = File.ReadAllText(filePath); try { var info = JsonSerializer.Deserialize>(jsonString)!; @@ -189,10 +203,10 @@ public ObservableCollection LoadUnits(string fileName) return new ObservableCollection(); } } - public void SaveUnits(ObservableCollection AllAssets, string fileName) + public void SaveUnits(ObservableCollection AllAssets) { string jsonString = JsonSerializer.Serialize(AllAssets); - File.WriteAllText(fileName, jsonString); + File.WriteAllText(filePath, jsonString); } } diff --git a/HeatOptimiser/Classes/DataVisualizer.cs b/HeatOptimiser/Classes/DataVisualizer.cs index 65c6542..1fec0c3 100644 --- a/HeatOptimiser/Classes/DataVisualizer.cs +++ b/HeatOptimiser/Classes/DataVisualizer.cs @@ -3,27 +3,70 @@ using System.Collections.ObjectModel; using DynamicData; using LiveChartsCore.Defaults; +using LiveChartsCore.SkiaSharpView; +using LiveChartsCore; +using LiveChartsCore.SkiaSharpView.Painting; +using SkiaSharp; using static System.Runtime.InteropServices.JavaScript.JSType; +using UserInterface.ViewModels; namespace HeatOptimiser { public static class DataVisualizer { - public static SourceData sourceData = new SourceData(); + public static SourceData sourceData = new(); - public static readonly ObservableCollection? HeatDemandData = new ObservableCollection(); - public static void AccessSummerData() + public static readonly ObservableCollection? HeatDemandData = new(); + public static void VisualiseSourceData(List> data, List names) { - // Accessing the summer data - foreach (var point in sourceData.LoadedData) + List colors = [ + new SKColor(194, 36, 62), + new SKColor(0, 92, 230) + ]; + SourceDataManager.Series = []; + SourceDataManager.XAxes = []; + SourceDataManager.YAxes = new Axis[names.Count]; + if (data.Count != names.Count) { - if (point.TimeFrom.HasValue) // Ensuring the time is not null + Console.WriteLine("Invalid arguments!"); + return; + } + for(int index = 0; index < data.Count; index++) + { + LineSeries lineSeries = new() + { + Values = data[index], + Name = names[index], + Fill = null, + GeometryStroke = null, + GeometryFill = null, + LineSmoothness = 1, + Stroke = new SolidColorPaint(colors[index%colors.Count]) + { + StrokeThickness = 3 + } + }; + Axis axis = new() + { + Name = names[index], + TextSize = 16, + NameTextSize = 18 + }; + if (index != 0) { - HeatDemandData?.Add(new DateTimePoint(point.TimeFrom.Value, point.HeatDemand)); - // SummerElectricityPrices.Add(point.ElectricityPrice); + lineSeries.LineSmoothness = 2; + lineSeries.ScalesYAt = 1; + axis.Position = LiveChartsCore.Measure.AxisPosition.End; } + SourceDataManager.Series.Add( + lineSeries + ); + SourceDataManager.YAxes[index] = axis; } + SourceDataManager.XAxes = [ + new DateTimeAxis(TimeSpan.FromDays(1), date => date.ToString("MMMM dd HH:mm")) + ]; } } } \ No newline at end of file diff --git a/HeatOptimiser/Classes/Optimiser.cs b/HeatOptimiser/Classes/Optimiser.cs index 1669723..65d104f 100644 --- a/HeatOptimiser/Classes/Optimiser.cs +++ b/HeatOptimiser/Classes/Optimiser.cs @@ -45,87 +45,93 @@ public static class Optimiser public static Schedule Optimise(DateTime startDate, DateTime endDate, OptimisationChoice optimisationChoice) { SourceData data = new(); - data.LoadedData = new List(); // Initialize LoadedData + if (data.LoadedData == null) + { + data.LoadedData = new ObservableCollection(); // Initialize LoadedData + } Schedule schedule = new(startDate, endDate); - ObservableCollection assets = AssetManager.GetAllUnits(); - - if (optimisationChoice == OptimisationChoice.Cost) + ObservableCollection assets = AssetManager.GetSelectedUnits(); // this is the change to selected assets + if(assets.Count != 0) { - Dictionary netCosts = new(); - - for (int i = 0; i < assets.Count; i++) + if (optimisationChoice == OptimisationChoice.Cost) { - netCosts.Add(assets[i], assets[i].Cost); - } + Dictionary netCosts = new(); - foreach (SourceDataPoint hour in SourceDataManager.GetDataInRange(data, startDate, endDate)) - { - Dictionary costs = new(netCosts); - foreach(ProductionAsset asset in costs.Keys) + for (int i = 0; i < assets.Count; i++) { - costs[asset] -= asset.Electricity / asset.Heat * hour.ElectricityPrice; + netCosts.Add(assets[i], assets[i].Cost); } - Dictionary sortedCosts = costs.OrderBy(x => x.Value).ToDictionary(); - double producedHeat = 0; - int index = 0; - ObservableCollection assetsUsed = []; - ObservableCollection assetDemands = []; - while (producedHeat < hour.HeatDemand) + foreach (SourceDataPoint hour in SourceDataManager.GetDataInRange(data, startDate, endDate)) { - assetsUsed.Add(sortedCosts.Keys.ToList()[index]); - if (sortedCosts.Keys.ToList()[index].Heat > (hour.HeatDemand - producedHeat)) + Dictionary costs = new(netCosts); + foreach(ProductionAsset asset in costs.Keys) { - assetDemands.Add(hour.HeatDemand.Value - producedHeat); - producedHeat = hour.HeatDemand.Value; + costs[asset] -= asset.Electricity / asset.Heat * hour.ElectricityPrice; } - else + + Dictionary sortedCosts = costs.OrderBy(x => x.Value).ToDictionary(); + double producedHeat = 0; + int index = 0; + ObservableCollection assetsUsed = []; + ObservableCollection assetDemands = []; + while (producedHeat < hour.HeatDemand) { - assetDemands.Add(sortedCosts.Keys.ToList()[index].Heat!.Value); - producedHeat += sortedCosts.Keys.ToList()[index].Heat!.Value; + assetsUsed.Add(sortedCosts.Keys.ToList()[index]); + if (sortedCosts.Keys.ToList()[index].Heat > (hour.HeatDemand - producedHeat)) + { + assetDemands.Add(hour.HeatDemand.Value - producedHeat); + producedHeat = hour.HeatDemand.Value; + } + else + { + assetDemands.Add(sortedCosts.Keys.ToList()[index].Heat!.Value); + producedHeat += sortedCosts.Keys.ToList()[index].Heat!.Value; + } + index += 1; } - index += 1; + schedule.AddHour(hour.TimeFrom, assetsUsed, assetDemands); } - schedule.AddHour(hour.TimeFrom, assetsUsed, assetDemands); } - } - - else if (optimisationChoice == OptimisationChoice.Emissions) - { - Dictionary emissions = new(); - - for (int i = 0; i < assets.Count; i++) + + else if (optimisationChoice == OptimisationChoice.Emissions) { - emissions.Add(assets[i], assets[i].CarbonDioxide); - } + Dictionary emissions = new(); - foreach (SourceDataPoint hour in SourceDataManager.GetDataInRange(data, startDate, endDate)) - { - Dictionary sortedEmissions = emissions.OrderBy(x => x.Value).ToDictionary(); - double producedHeat = 0; - int index = 0; - ObservableCollection assetsUsed = []; - ObservableCollection assetDemands = []; - while (producedHeat < hour.HeatDemand) + for (int i = 0; i < assets.Count; i++) { - assetsUsed.Add(sortedEmissions.Keys.ToList()[index]); - if (sortedEmissions.Keys.ToList()[index].Heat > (hour.HeatDemand - producedHeat)) - { - assetDemands.Add(hour.HeatDemand.Value - producedHeat); - producedHeat = hour.HeatDemand.Value; - } - else + emissions.Add(assets[i], assets[i].CarbonDioxide); + } + + foreach (SourceDataPoint hour in SourceDataManager.GetDataInRange(data, startDate, endDate)) + { + Dictionary sortedEmissions = emissions.OrderBy(x => x.Value).ToDictionary(); + double producedHeat = 0; + int index = 0; + ObservableCollection assetsUsed = []; + ObservableCollection assetDemands = []; + while (producedHeat < hour.HeatDemand) { - assetDemands.Add(sortedEmissions.Keys.ToList()[index].Heat!.Value); - producedHeat += sortedEmissions.Keys.ToList()[index].Heat!.Value; + assetsUsed.Add(sortedEmissions.Keys.ToList()[index]); + if (sortedEmissions.Keys.ToList()[index].Heat > (hour.HeatDemand - producedHeat)) + { + assetDemands.Add(hour.HeatDemand.Value - producedHeat); + producedHeat = hour.HeatDemand.Value; + } + else + { + assetDemands.Add(sortedEmissions.Keys.ToList()[index].Heat!.Value); + producedHeat += sortedEmissions.Keys.ToList()[index].Heat!.Value; + } + index += 1; } - index += 1; + schedule.AddHour(hour.TimeFrom, assetsUsed, assetDemands); } - schedule.AddHour(hour.TimeFrom, assetsUsed, assetDemands); } - } + return schedule; + } return schedule; - } + } } } \ No newline at end of file diff --git a/HeatOptimiser/Classes/ResultsDataManager.cs b/HeatOptimiser/Classes/ResultsDataManager.cs index 0fc4aa4..bb74b25 100644 --- a/HeatOptimiser/Classes/ResultsDataManager.cs +++ b/HeatOptimiser/Classes/ResultsDataManager.cs @@ -125,5 +125,40 @@ public static Schedule Load(DateOnly dateFrom, DateOnly dateTo) return schedule; } + + public static Schedule LoadAll() + { + var csvConfig = new CsvConfiguration(CultureInfo.CurrentCulture) + { + HasHeaderRecord = false + }; + + using var streamReader = File.OpenText(filePath); + using var csvReader = new CsvReader(streamReader, csvConfig); + + DateTime minDate = DateTime.MaxValue; + DateTime maxDate = DateTime.MinValue; + + while (csvReader.Read()) + { + string dateString = csvReader.GetField(0); + DateTime date = DateTime.ParseExact(dateString, "dd/MM/yyyy HH:mm", CultureInfo.InvariantCulture); + + if (date < minDate) + { + minDate = date; + } + + if (date > maxDate) + { + maxDate = date; + } + } + + DateOnly minDateOnly = new DateOnly(minDate.Year, minDate.Month, minDate.Day); + DateOnly maxDateOnly = new DateOnly(maxDate.Year, maxDate.Month, maxDate.Day); + + return Load(minDateOnly, maxDateOnly); + } } } diff --git a/HeatOptimiser/Classes/SettingsManager.cs b/HeatOptimiser/Classes/SettingsManager.cs index cb8615f..eb53475 100644 --- a/HeatOptimiser/Classes/SettingsManager.cs +++ b/HeatOptimiser/Classes/SettingsManager.cs @@ -43,6 +43,7 @@ public static string GetSetting(string settingName) { try { + Configuration = InitializeBuilder(); return Configuration?[settingName]! ?? string.Empty; } catch (Exception) diff --git a/HeatOptimiser/Classes/SourceDataManager.cs b/HeatOptimiser/Classes/SourceDataManager.cs index 2160c97..612bf15 100644 --- a/HeatOptimiser/Classes/SourceDataManager.cs +++ b/HeatOptimiser/Classes/SourceDataManager.cs @@ -3,6 +3,11 @@ using System; using System.Collections.Generic; using System.IO; +using System.Collections.ObjectModel; +using LiveChartsCore.Defaults; +using LiveChartsCore; +using LiveChartsCore.SkiaSharpView; +using CommunityToolkit.Mvvm.ComponentModel; namespace HeatOptimiser { @@ -17,7 +22,7 @@ public class SourceDataPoint public class SourceData { private const string defaultSavePath = "data/source_data.csv"; - public List LoadedData { get; set; } + public ObservableCollection LoadedData { get; set; } public SourceData() { @@ -41,29 +46,38 @@ public SourceData() SourceDataManager.WriteToCSV(LoadedData, defaultSavePath); } } - } - public void LoadSourceData(string filePath, int rowStart, int columnStart) + public void LoadSourceData(string filePath, int columnStart, int rowStart) { - LoadedData = SourceDataManager.LoadXLSXFile(filePath, rowStart, columnStart); + LoadedData.Clear(); + LoadedData = SourceDataManager.LoadXLSXFile(filePath, columnStart, rowStart); if (!(LoadedData.Count > 0)) { SettingsManager.SaveSetting("DataLoaded", "False"); } - SettingsManager.SaveSetting("XLSXFilePath", filePath); - SettingsManager.SaveSetting("Row", rowStart.ToString()); - SettingsManager.SaveSetting("Column", columnStart.ToString()); - SettingsManager.SaveSetting("DataLoaded", "True"); - // Automatically write the CSV files - SourceDataManager.WriteToCSV(LoadedData, defaultSavePath); + else + { + SettingsManager.SaveSetting("XLSXFilePath", filePath); + SettingsManager.SaveSetting("Row", rowStart.ToString()); + SettingsManager.SaveSetting("Column", columnStart.ToString()); + SettingsManager.SaveSetting("DataLoaded", "True"); + + // Automatically write the CSV files + SourceDataManager.WriteToCSV(LoadedData, defaultSavePath); + } } - } public static class SourceDataManager { - public static List LoadXLSXFile(string file, int rowStart, int columnStart, int workSheetNumber = 0) + private static List _heatDemandData; + private static List _electricityPriceData; + public static ObservableCollection Series { get; set; } + + public static Axis[] XAxes { get; set; } + public static Axis[] YAxes { get; set; } + public static ObservableCollection LoadXLSXFile(string file, int columnStart, int rowStart, int workSheetNumber = 0) { - var sourceList = new List(); + var sourceObservableCollection = new ObservableCollection(); if (file != string.Empty || File.Exists(file) || rowStart >= 1 || columnStart >= 1) { ExcelPackage.LicenseContext = LicenseContext.NonCommercial; // EPPlus license @@ -78,14 +92,12 @@ public static List LoadXLSXFile(string file, int rowStart, int } catch (Exception e) { - Console.WriteLine($"Worksheet not found: {e}"); - return sourceList; + return sourceObservableCollection; } if (worksheet.Dimension == null) { - Console.WriteLine("The worksheet is empty."); - return sourceList; + return sourceObservableCollection; } for (int row = rowStart; row <= worksheet.Dimension.End.Row; row++) @@ -101,24 +113,23 @@ public static List LoadXLSXFile(string file, int rowStart, int HeatDemand = worksheet.Cells[row, columnStart + 2]?.Value != null ? double.Parse(worksheet.Cells[row, columnStart + 2].Value.ToString()!) : null, ElectricityPrice = worksheet.Cells[row, columnStart + 3]?.Value != null ? double.Parse(worksheet.Cells[row, columnStart + 3].Value.ToString()!) : null }; - sourceList.Add(sourceData); + sourceObservableCollection.Add(sourceData); } catch (Exception e) { - Console.WriteLine($"Error: {e}"); } } } } - return sourceList; + return sourceObservableCollection; } - public static List GetDataInRange(SourceData data, DateTime startDate, DateTime endDate) + public static ObservableCollection GetDataInRange(SourceData data, DateTime startDate, DateTime endDate) { DateTime winterEnd = DateTime.ParseExact("31/03/2023", "dd/MM/yyyy", CultureInfo.InvariantCulture); bool rangeExists = false; int startIndex = 0; - List dataCollection = data.LoadedData; + ObservableCollection dataCollection = data.LoadedData; foreach (SourceDataPoint point in dataCollection) { if (point.TimeFrom.HasValue) @@ -135,31 +146,51 @@ public static List GetDataInRange(SourceData data, DateTime sta int endIndex = startIndex; if (rangeExists) { - foreach (SourceDataPoint point in dataCollection.GetRange(startIndex, dataCollection.Count - startIndex)) + ObservableCollection range = new ObservableCollection(); + for (int i = startIndex; i < dataCollection.Count; i++) { + SourceDataPoint point = dataCollection[i]; endIndex++; DateTime dt = (DateTime)point.TimeTo!; if (dt.Date > endDate.Date) { break; } + range.Add(point); } - return dataCollection.GetRange(startIndex, endIndex - startIndex); + return new ObservableCollection(range); } - return new List(); + return new ObservableCollection(); } - public static void WriteToCSV(List data, string filePath) + public static void WriteToCSV(ObservableCollection data, string filePath) { using (var writer = new StreamWriter(filePath)) { - writer.WriteLine("TimeFrom,TimeTo,HeatDemand,ElectricityPrice"); foreach (var point in data) { var line = $"{point.TimeFrom},{point.TimeTo},{point.HeatDemand},{point.ElectricityPrice}"; - writer.WriteLine(line); } } } + + public static void VisualiseData(SourceData sourceData) + { + _heatDemandData = []; + _electricityPriceData = []; + + foreach (var point in sourceData.LoadedData) + { + if (point.HeatDemand.HasValue && point.TimeFrom.HasValue && point.ElectricityPrice.HasValue) + { + _heatDemandData.Add(new DateTimePoint(point.TimeFrom.Value, point.HeatDemand.Value)); + _electricityPriceData.Add(new DateTimePoint(point.TimeFrom.Value, point.ElectricityPrice.Value)); + } + } + + List> data = [_heatDemandData, _electricityPriceData]; + List names = ["Heat Deamand (MWh)", "Electricity Price (€/MWh)"]; + DataVisualizer.VisualiseSourceData(data, names); + } } } diff --git a/HeatOptimiser/ProductionAssets.json b/HeatOptimiser/ProductionAssets.json index 4c08df8..3829681 100644 --- a/HeatOptimiser/ProductionAssets.json +++ b/HeatOptimiser/ProductionAssets.json @@ -1 +1 @@ -[{"ID":"f728fabf-b907-41bb-a0d5-91f699d20a85","Name":"GB","Image":"none","Heat":5,"Electricity":0,"Energy":1.1,"Cost":500,"CarbonDioxide":215,"IsSelected":false},{"ID":"33a34683-f561-4265-a70b-c8868407cce2","Name":"OB","Image":"none","Heat":4,"Electricity":0,"Energy":1.2,"Cost":700,"CarbonDioxide":265,"IsSelected":false}] \ No newline at end of file +[{"ID":"eee70833-bbe0-4f95-9adc-13da918e44c6","Name":"GB","Image":"none","Heat":1,"Electricity":0,"Energy":1.1,"Cost":500,"CarbonDioxide":215,"IsSelected":false,"OptimiseSelected":false},{"ID":"2dcd3717-da68-4508-ac88-8694d949f58a","Name":"OB","Image":"none","Heat":4,"Electricity":0,"Energy":1.2,"Cost":700,"CarbonDioxide":265,"IsSelected":false,"OptimiseSelected":false},{"ID":"12ab8f05-8100-4d26-94ff-3b5a4cb91bcd","Name":"GM","Image":"none","Heat":3.6,"Electricity":2.7,"Energy":1.9,"Cost":1100,"CarbonDioxide":640,"IsSelected":false,"OptimiseSelected":false},{"ID":"9f78b5ff-f7f4-4807-b60a-8c13b2a53d80","Name":"EK","Image":"none","Heat":8,"Electricity":-8,"Energy":0,"Cost":50,"CarbonDioxide":0,"IsSelected":false,"OptimiseSelected":false}] \ No newline at end of file diff --git a/HeatOptimiser/ViewModels/AssetManagerViewModel.cs b/HeatOptimiser/ViewModels/AssetManagerViewModel.cs index 4c45c4e..6dca6dd 100644 --- a/HeatOptimiser/ViewModels/AssetManagerViewModel.cs +++ b/HeatOptimiser/ViewModels/AssetManagerViewModel.cs @@ -159,18 +159,13 @@ public string AssetButton get =>_assetButton; set => this.RaiseAndSetIfChanged(ref _assetButton, value); } - public int _assetCount; - public int AssetCount - { - get => Assets.Count(); - } public string _errorText; public string ErrorText { get => _errorText; set => this.RaiseAndSetIfChanged(ref _errorText, value); } - public ObservableCollection Assets {get;} = new(); + public ObservableCollection ProductionAssets{get; set;} = new(); public ReactiveCommand AddAssetCommand { get; } @@ -210,7 +205,7 @@ public void DeleteAsset() } public void EditAsset() { - AssetManager.SaveUnits(ProductionAssets, "ProductionAssets.json"); + AssetManager.SaveUnits(ProductionAssets); } public void ValidateInput(string input) @@ -225,7 +220,7 @@ public AssetManagerViewModel() DeleteAssetCommand=ReactiveCommand.Create(DeleteAsset); UpdateAssetCommand=ReactiveCommand.Create(EditAsset); //assetManager.SaveUnits(ProductionAssets, assetManager.saveFileName); - ProductionAssets=AssetManager.LoadUnits(AssetManager.saveFileName); + ProductionAssets=AssetManager.LoadUnits(); } } \ No newline at end of file diff --git a/HeatOptimiser/ViewModels/HomepageViewModel.cs b/HeatOptimiser/ViewModels/HomepageViewModel.cs index 373e068..872c49b 100644 --- a/HeatOptimiser/ViewModels/HomepageViewModel.cs +++ b/HeatOptimiser/ViewModels/HomepageViewModel.cs @@ -20,95 +20,14 @@ public int AssetCount set => this.RaiseAndSetIfChanged(ref _assetCount, value); } - private readonly ObservableCollection _heatDemandData; - private readonly ObservableCollection _electricityPriceData; - private string _sourceText; + - public string SourceText - { - get => _sourceText; - set => this.RaiseAndSetIfChanged(ref _sourceText, value); - } - - public ObservableCollection Series { get; set; } - - public Axis[] XAxes { get; set; } - public Axis[] YAxes { get; set; } + public HomepageViewModel() { - _heatDemandData = new ObservableCollection(); - _electricityPriceData = new ObservableCollection(); - _sourceText = "Source Data not loaded. \nPlease load the data."; - _assetCount = AssetManager.LoadUnits(AssetManager.saveFileName).Count; - - if (SettingsManager.GetSetting("DataLoaded") == "True") - { - _sourceText = "Source Data loaded."; - foreach (var point in DataVisualizer.sourceData.LoadedData) - { - if (point.HeatDemand.HasValue && point.TimeFrom.HasValue && point.ElectricityPrice.HasValue) - { - _heatDemandData.Add(new DateTimePoint(point.TimeFrom.Value, point.HeatDemand.Value)); - _electricityPriceData.Add(new DateTimePoint(point.TimeFrom.Value, point.ElectricityPrice.Value)); - - Console.WriteLine($"Added Point: TimeFrom={point.TimeFrom.Value}, HeatDemand={point.HeatDemand.Value}, ElectricityPrice={point.ElectricityPrice.Value}"); - } - } - } - - Series = new ObservableCollection - { - new LineSeries - { - Values = _heatDemandData, - Name = "Heat Demand (MWh)", - Fill = null, - GeometryStroke = null, - GeometryFill = null, - LineSmoothness = 1, - Stroke = new SolidColorPaint(new SKColor(194, 36, 62)) - { - StrokeThickness = 3 // Set the thickness of the Heat Demand line - } - }, - new LineSeries - { - Values = _electricityPriceData, - Name = "Electricity Price (€/MWh)", - Fill = null, - GeometryStroke = null, - GeometryFill = null, - LineSmoothness = 2, - ScalesYAt = 1, // This tells the series to use the secondary Y-axis - Stroke = new SolidColorPaint(new SKColor(0, 92, 230)) // Set the color shade - { - StrokeThickness = 3 // Set the thickness of the Electricity Price line - }, - } - }; - - XAxes = new Axis[] - { - new DateTimeAxis(TimeSpan.FromDays(1), date => date.ToString("MMMM dd HH:mm")) - }; + _assetCount = AssetManager.LoadUnits().Count; - YAxes = new Axis[] - { - new Axis - { - Name = "Heat Demand (MWh)", - TextSize = 16, - NameTextSize = 18 - }, - new Axis - { - Name = "Electricity Price (€/MWh)", - TextSize = 16, - NameTextSize = 18, - Position = LiveChartsCore.Measure.AxisPosition.End - } - }; } } } diff --git a/HeatOptimiser/ViewModels/MainWindowViewModel.cs b/HeatOptimiser/ViewModels/MainWindowViewModel.cs index fea6554..1aab0b3 100644 --- a/HeatOptimiser/ViewModels/MainWindowViewModel.cs +++ b/HeatOptimiser/ViewModels/MainWindowViewModel.cs @@ -2,6 +2,7 @@ using System.Reflection; using ReactiveUI; using System.Collections.ObjectModel; +using Avalonia.Controls; namespace UserInterface.ViewModels; @@ -39,32 +40,33 @@ public double ButtonTextOpacity } private ReactiveObject _currentView; -public ReactiveObject CurrentView { - get =>_currentView; - set => this.RaiseAndSetIfChanged(ref _currentView, value); - } - -public ReactiveCommand PaneCommand {get;} -public ReactiveCommand OpenAssetManagerCommand {get;} -public ReactiveCommand OpenSourceDataManagerCommand {get;} -public ReactiveCommand OpenHomepageCommand {get;} -public ReactiveCommand OpenOptimiserCommand {get;} -public ReactiveCommand OpenResultsCommand {get;} -public ReactiveCommand OpenSourceDataCommand {get;} - - -public MainWindowViewModel() -{ - CurrentView=new HomepageViewModel(); - PaneCommand=ReactiveCommand.Create(()=> PaneStatus=!PaneStatus); - OpenAssetManagerCommand=ReactiveCommand.Create(()=> CurrentView=new AssetManagerViewModel()); - OpenHomepageCommand=ReactiveCommand.Create(()=> CurrentView=new HomepageViewModel()); - OpenOptimiserCommand=ReactiveCommand.Create(()=> CurrentView= new OptimiserViewModel()); - OpenResultsCommand=ReactiveCommand.Create(()=> CurrentView= new ResultsViewModel()); - OpenSourceDataCommand=ReactiveCommand.Create(()=> CurrentView=new SourceDataViewModel()); -} + public ReactiveObject CurrentView { + get =>_currentView; + set => this.RaiseAndSetIfChanged(ref _currentView, value); + } + public ReactiveCommand PaneCommand {get;} + public ReactiveCommand OpenAssetManagerCommand {get;} + public ReactiveCommand OpenSourceDataManagerCommand {get;} + public ReactiveCommand OpenHomepageCommand {get;} + public ReactiveCommand OpenOptimiserCommand {get;} + public ReactiveCommand OpenResultsCommand {get;} + public ReactiveCommand OpenSourceDataCommand {get;} + public MainWindowViewModel() + { + CurrentView=new HomepageViewModel(); + PaneCommand=ReactiveCommand.Create(()=> PaneStatus=!PaneStatus); + OpenAssetManagerCommand=ReactiveCommand.Create(()=> CurrentView=new AssetManagerViewModel()); + OpenHomepageCommand=ReactiveCommand.Create(()=> CurrentView=new HomepageViewModel()); + OpenOptimiserCommand=ReactiveCommand.Create(()=> CurrentView= new OptimiserViewModel()); + OpenResultsCommand=ReactiveCommand.Create(()=> CurrentView= new ResultsViewModel()); + OpenSourceDataCommand=ReactiveCommand.Create(()=> CurrentView=new SourceDataViewModel()); + } + public void ChangeView() + { + this.CurrentView=new SourceDataViewModel(); + } } diff --git a/HeatOptimiser/ViewModels/OptimiserViewModel.cs b/HeatOptimiser/ViewModels/OptimiserViewModel.cs index 68592ea..55506ee 100644 --- a/HeatOptimiser/ViewModels/OptimiserViewModel.cs +++ b/HeatOptimiser/ViewModels/OptimiserViewModel.cs @@ -4,6 +4,7 @@ using Avalonia.Controls; using System.Reactive; using System.Data.SqlTypes; +using System.Collections.ObjectModel; namespace UserInterface.ViewModels; @@ -22,23 +23,58 @@ public DateTime EndingDate get => _endingDate; set => this.RaiseAndSetIfChanged(ref _endingDate, value); } + public ObservableCollection ProductionAssets{get; set;} = new(); public ReactiveCommand OptimiseCommand { get; } + public ReactiveCommand TestSelectedList { get; } + private int _selectedCategoryIndex; + public int SelectedCategoryIndex + { + get => _selectedCategoryIndex; + set => this.RaiseAndSetIfChanged(ref _selectedCategoryIndex, value); + } - public void Optimise(DateTime start, DateTime end ) + public void TestingSelectedList() + { + ObservableCollection testList = AssetManager.GetSelectedUnits(); + foreach(ProductionAsset asset in testList) + { + Console.WriteLine(asset.Name); + } + } + public void Optimise(DateTime start, DateTime end, int categoryIndex) { - Console.WriteLine("Testing"); - Schedule optimisedData = Optimiser.Optimise(start, end, OptimisationChoice.Cost); //change OptimisationChoice.Cost to correspond with users choice - third argument should be something like OptimisationChoice[OptimisationCategory.SelectedIndex] + TestingSelectedList(); + Console.WriteLine($"Testing {categoryIndex} optimisation."); + + OptimisationChoice choice; + if (categoryIndex == 0) + { + choice = OptimisationChoice.Cost; + } + else + { + choice = OptimisationChoice.Emissions; + } + Schedule optimisedData = Optimiser.Optimise(start, end, choice); + ResultsDataManager.Save(optimisedData); + Console.WriteLine(StartingDate); Console.WriteLine("Optimised Schedule:"); foreach (var hour in optimisedData.schedule) { Console.WriteLine($"Hour: {hour.Hour}, Assets: {string.Join(",", hour.Assets!)}, Demands: {string.Join(",", hour.Demands!)}"); + foreach (var asset in hour.Assets!) + { + Console.WriteLine($"Asset: {asset.Name}, Heat: {asset.Heat}, Demand {hour.Demands![hour.Assets!.IndexOf(asset)]}"); + } } } public OptimiserViewModel() { Console.WriteLine("OptimiserViewModel created"); - OptimiseCommand=ReactiveCommand.Create(()=> Optimise(_startingDate, _endingDate)); + ProductionAssets=AssetManager.LoadUnits(); + OptimiseCommand=ReactiveCommand.Create(()=> Optimise(_startingDate, _endingDate, _selectedCategoryIndex)); + } } \ No newline at end of file diff --git a/HeatOptimiser/ViewModels/ResultsViewModel.cs b/HeatOptimiser/ViewModels/ResultsViewModel.cs index 8fdda4b..d16a53d 100644 --- a/HeatOptimiser/ViewModels/ResultsViewModel.cs +++ b/HeatOptimiser/ViewModels/ResultsViewModel.cs @@ -10,53 +10,66 @@ using System.Collections.ObjectModel; using System.Reactive.Linq; using System.Security.Cryptography.X509Certificates; +using System.Collections.Generic; +using CommunityToolkit.Mvvm.ComponentModel; +using LiveChartsCore; +using LiveChartsCore.SkiaSharpView; namespace UserInterface.ViewModels; public class ResultsViewModel : ViewModelBase { - private readonly ObservableCollection HeatDemandData; - public ObservableCollection Series { get; set; } + public ISeries[] Series { get; set; } + public Axis[] XAxes { get; set; } public ResultsViewModel() { - // Use ObservableCollections to let the chart listen for changes (or any INotifyCollectionChanged). - HeatDemandData = new ObservableCollection(); - - foreach (var point in DataVisualizer.sourceData.LoadedData) + + Schedule results = ResultsDataManager.LoadAll(); + List> demandsList = new(); + List assets = AssetManager.GetAllUnits().ToList(); + int assetCount = assets.Count; + foreach (ProductionAsset asset in assets) { - if (point.HeatDemand.HasValue) + List demands = new(); + foreach (ScheduleHour hour in results.schedule) { - HeatDemandData.Add(new DateTimePoint(point.TimeFrom!.Value, point.HeatDemand.Value)); + if (hour.Assets!.Contains(asset)) + { + demands.Add(hour.Demands![hour.Assets.IndexOf(asset)]); + } + else + { + demands.Add(0); + } } + demandsList.Add(demands); + } + List AssetNames = new(); + foreach (ProductionAsset asset in assets) + { + AssetNames.Add(asset.Name); } - - Series = new ObservableCollection - { - new LineSeries + Series = demandsList.Select(demands => new StackedStepAreaSeries { - Values = HeatDemandData, - Name = "Heat Demand", - Fill = null, - GeometryStroke = null, - GeometryFill = null, - LineSmoothness = 1 - }, - // new LineSeries - // { - // Values = SummerHeatDemandData, - // Fill = null - // } - }; - + Values = demands, + Name = AssetNames[demandsList.IndexOf(demands)], + Stroke = null + }).ToArray(); - } - public Axis[] XAxes { get; set; } = - { - new DateTimeAxis(TimeSpan.FromDays(1), date => date.ToString("MMMM dd HH:mm")) - }; -} - - + List hours = new(); + foreach (ScheduleHour hour in results.schedule) + { + hours.Add(hour.Hour!.Value); + } + XAxes = + [ + new Axis + { + Labels = hours.Select(hour => hour.ToString("dd/MM/yyyy HH:mm")).ToArray() + } + ]; + } +} \ No newline at end of file diff --git a/HeatOptimiser/ViewModels/SourceDataViewModel.cs b/HeatOptimiser/ViewModels/SourceDataViewModel.cs index 6a9dffb..1ba79f0 100644 --- a/HeatOptimiser/ViewModels/SourceDataViewModel.cs +++ b/HeatOptimiser/ViewModels/SourceDataViewModel.cs @@ -1,6 +1,14 @@ using ReactiveUI; using System.Reactive; using HeatOptimiser; +using System.Collections.ObjectModel; +using LiveChartsCore.Defaults; +using LiveChartsCore.SkiaSharpView; +using LiveChartsCore; +using LiveChartsCore.SkiaSharpView.Painting; +using SkiaSharp; +using System; +using System.Collections.Generic; namespace UserInterface.ViewModels { @@ -15,6 +23,27 @@ public class SourceDataViewModel : ViewModelBase private bool _isErrorSelectRowVisible; private string _errorSelectColumn; private bool _isErrorSelectColumnVisible; + private string _sourceText; + private ObservableCollection _series = []; + public ObservableCollection Series { + get => _series; + set => this.RaiseAndSetIfChanged(ref _series, value); + } + private Axis[] _XAxes = []; + private Axis[] _YAxes = []; + public Axis[] XAxes { + get => _XAxes; + set => this.RaiseAndSetIfChanged(ref _XAxes, value); + } + public Axis[] YAxes { + get => _YAxes; + set => this.RaiseAndSetIfChanged(ref _YAxes, value); + } + public string SourceText + { + get => _sourceText; + set => this.RaiseAndSetIfChanged(ref _sourceText, value); + } public ReactiveCommand SourceDataCommand { get; } @@ -75,8 +104,8 @@ public bool IsErrorSelectColumnVisible public SourceDataViewModel() { _selectedFilePath = SettingsManager.GetSetting("XLSXFilePath"); - _selectedRow = int.TryParse(SettingsManager.GetSetting("Row"), out int row) ? row : 7; _selectedColumn = int.TryParse(SettingsManager.GetSetting("Column"), out int column) ? column : 4; + _selectedRow = int.TryParse(SettingsManager.GetSetting("Row"), out int row) ? row : 7; SourceData sourceData = new SourceData(); SourceDataCommand = ReactiveCommand.Create(LoadSourceData); @@ -87,6 +116,19 @@ public SourceDataViewModel() IsErrorSelectRowVisible = false; ErrorSelectColumn = string.Empty; IsErrorSelectColumnVisible = false; + + if (SettingsManager.GetSetting("DataLoaded") == "True") + { + SourceDataManager.VisualiseData(sourceData); + Series = SourceDataManager.Series; + XAxes = SourceDataManager.XAxes; + YAxes = SourceDataManager.YAxes; + _sourceText = "Source Data loaded."; + } + else + { + _sourceText = "Source Data not loaded. \nPlease load the data."; + } } private void LoadSourceData() @@ -130,8 +172,29 @@ private void LoadSourceData() if (!hasError) { // No errors, proceed with loading the source data - SourceData sourceData = new SourceData(); - sourceData.LoadSourceData(SelectedFilePath, SelectedRow, SelectedColumn); + SourceData sourceData = new(); + sourceData.LoadSourceData(SelectedFilePath, SelectedColumn, SelectedRow); + + if (SettingsManager.GetSetting("DataLoaded") == "True") { + SourceText = "Source Data loaded."; + + SourceDataManager.VisualiseData(sourceData); + Series = SourceDataManager.Series; + XAxes = SourceDataManager.XAxes; + YAxes = SourceDataManager.YAxes; + } + else + { + SourceText = "Source Data not loaded. \nPlease load the data."; + Series.Clear(); + XAxes = []; + YAxes = []; + } + } + else + { + SettingsManager.SaveSetting("DataLoaded", "False"); + SourceText = "Not able to load data. Check file path!"; } } } diff --git a/HeatOptimiser/Views/AssetManagerView.axaml b/HeatOptimiser/Views/AssetManagerView.axaml index 9080b3e..2405909 100644 --- a/HeatOptimiser/Views/AssetManagerView.axaml +++ b/HeatOptimiser/Views/AssetManagerView.axaml @@ -57,7 +57,7 @@ - diff --git a/HeatOptimiser/Views/OptimiserView.axaml b/HeatOptimiser/Views/OptimiserView.axaml index 80db852..f732d7e 100644 --- a/HeatOptimiser/Views/OptimiserView.axaml +++ b/HeatOptimiser/Views/OptimiserView.axaml @@ -9,32 +9,44 @@ x:DataType="views:OptimiserViewModel"> - - - - - + + + + + - - - - + + + - + + + Optimize by Costs Optimize by CarbonDioxide + - + + + + + + diff --git a/HeatOptimiser/data/appsettings.json b/HeatOptimiser/data/appsettings.json index ecdc46e..d4a2be5 100644 --- a/HeatOptimiser/data/appsettings.json +++ b/HeatOptimiser/data/appsettings.json @@ -1,6 +1,6 @@ { "DataLoaded": "True", "XLSXFilePath": "data/sourcedata.xlsx", - "Row": "7", - "Column": "4" + "Row": "4", + "Column": "7" } \ No newline at end of file diff --git a/HeatOptimiser/data/resultdata.csv b/HeatOptimiser/data/resultdata.csv index 7e02a69..b07dfe8 100644 --- a/HeatOptimiser/data/resultdata.csv +++ b/HeatOptimiser/data/resultdata.csv @@ -1,144 +1,47 @@ -09/02/2023 00:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/2.5811975567687897, 6.969233403275733, 0, 5339.317312445668, 10.404275357860701, 2726.9664363320253 -09/02/2023 01:00, 243582f4-afb9-468f-86fe-48592468d9b2/75b9bab8-793f-4767-9b73-9c153d3727d1, 5/2.6816492396656697, 0, -21.453193917325358, 2634.0824619832833, 5.5, 1075 -09/02/2023 02:00, 243582f4-afb9-468f-86fe-48592468d9b2/75b9bab8-793f-4767-9b73-9c153d3727d1, 5/2.7117757886733003, 0, -21.694206309386402, 2635.588789433665, 5.5, 1075 -09/02/2023 03:00, 243582f4-afb9-468f-86fe-48592468d9b2/75b9bab8-793f-4767-9b73-9c153d3727d1, 5/2.70081620906459, 0, -21.60652967251672, 2635.0408104532294, 5.5, 1075 -09/02/2023 04:00, 243582f4-afb9-468f-86fe-48592468d9b2/75b9bab8-793f-4767-9b73-9c153d3727d1, 5/3.155612704067501, 0, -25.244901632540007, 2657.780635203375, 5.5, 1075 -09/02/2023 05:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/3.4499518334884094, 9.314869950418705, 0, 6294.94701683725, 12.054908483627978, 3282.969173432582 -09/02/2023 06:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/3.506858972829191, 9.468519226638815, 0, 6357.5448701121095, 12.163032048375463, 3319.3897426106823 -09/02/2023 07:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/2.7880398709744902, 7.5277076516311245, 0, 5566.843858071939, 10.797275754851531, 2859.3455174236738 -09/02/2023 08:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/2.6354359882089797, 7.115677168164246, 0, 5398.979587029878, 10.507328377597062, 2761.679032453747 -09/02/2023 09:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/4.10508180453566, 9.72, 0, 6012.5409022678305, 11.355589984989226, 3186.5925879751667 -09/02/2023 10:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/2.64004776638693, 7.128128969244711, 0, 5404.052543025623, 10.516090756135167, 2764.630570487635 -09/02/2023 11:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.9949229698098998, 5.38629201848673, 0, 4694.415266790889, 9.29035364263881, 2351.7507006783358 -09/02/2023 12:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.39427780257608, 3.764550066955416, 0, 4033.705582833688, 8.149127824894553, 1967.3377936486913 -09/02/2023 13:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.2233187590116996, 3.302960649331589, 0, 3845.6506349128695, 7.824305642122229, 1857.9240057674879 -09/02/2023 14:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.2789455976790904, 3.4531531137335443, 0, 3906.8401574469995, 7.929996635590271, 1893.5251825146179 -09/02/2023 15:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.7771797577526902, 4.798385345932264, 0, 4454.89773352796, 8.87664153973011, 2212.395044961722 -09/02/2023 16:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/2.0115302867870897, 5.431131774325142, 0, 4712.683315465799, 9.32190754489547, 2362.3793835437373 -09/02/2023 17:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/2.1750254355557797, 5.872568676000605, 0, 4892.527979111357, 9.63254832755598, 2467.016278755699 -09/02/2023 18:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.6531165309389397, 4.4634146335351375, 0, 4318.428184032834, 8.640921408783985, 2132.994579800921 -09/02/2023 19:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.7192966681000899, 4.642101003870243, 0, 4391.226334910099, 8.766663669390171, 2175.3498675840574 -09/02/2023 20:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.8612382308801, 5.025343223376271, 0, 4547.362053968111, 9.03635263867219, 2266.192467763264 -09/02/2023 21:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.8301126466303401, 4.941304145901919, 0, 4513.1239112933745, 8.977214028597647, 2246.2720938434177 -09/02/2023 22:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.8593902068564603, 5.0203535585124435, 0, 4545.329227542106, 9.032841393027274, 2265.0097323881346 -09/02/2023 23:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.77969137597667, 4.805166715137009, 0, 4457.660513574337, 8.881413614355672, 2214.0024806250685 -10/02/2023 00:00, 243582f4-afb9-468f-86fe-48592468d9b2/75b9bab8-793f-4767-9b73-9c153d3727d1, 5/1.7967845010577301, 0, -14.374276008461841, 2589.8392250528864, 5.5, 1075 -10/02/2023 01:00, 243582f4-afb9-468f-86fe-48592468d9b2/75b9bab8-793f-4767-9b73-9c153d3727d1, 5/1.80002567403369, 0, -14.40020539226952, 2590.0012837016843, 5.5, 1075 -10/02/2023 02:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.8217013344661401, 4.918593603058579, 0, 4503.871467912754, 8.961232535485665, 2240.88885405833 -10/02/2023 03:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.9521719273270497, 5.270864203783034, 0, 4647.3891200597545, 9.209126661921394, 2324.390033489312 -10/02/2023 04:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/2.72833779017025, 7.366512033459675, 0, 5501.171569187275, 10.683841801323474, 2821.13618570896 -10/02/2023 05:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/2.8965322817264703, 7.82063716066147, 0, 5686.185509899117, 11.003411335280294, 2928.780660304941 -10/02/2023 06:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/3.10747297305028, 8.390177027235756, 0, 5918.2202703553085, 11.404198648795532, 3063.782702752179 -10/02/2023 07:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/4.01546064014064, 9.72, 0, 5967.73032007032, 11.257006704154705, 3167.3240376302374 -10/02/2023 08:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/4.039861080373919, 9.72, 0, 5979.93054018696, 11.283847188411311, 3172.5701322803925 -10/02/2023 09:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.8392426139447395, 9.72, 0, 5879.62130697237, 11.063166875339213, 3129.437161998119 -10/02/2023 10:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.66322821373357, 9.72, 0, 5791.614106866785, 10.869551035106927, 3091.5940659527178 -10/02/2023 11:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/2.02567221593565, 5.469314983026255, 0, 4728.239437529215, 9.348777210277735, 2371.430218198816 -10/02/2023 12:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.7714975403589701, 4.78304335896922, 0, 4448.6472943948675, 8.865845326682043, 2208.758425829741 -10/02/2023 13:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.7231395297612098, 4.652476730355267, 0, 4395.453482737331, 8.7739651065463, 2177.809299047174 -10/02/2023 14:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.9015648163024599, 5.134225004016642, 0, 4591.721297932706, 9.112973150974673, 2292.0014824335744 -10/02/2023 15:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/2.3419144156400398, 6.323168922228108, 0, 5076.105857204044, 9.949637389716075, 2573.8252260096256 -10/02/2023 16:00, 243582f4-afb9-468f-86fe-48592468d9b2/75b9bab8-793f-4767-9b73-9c153d3727d1, 5/2.4846766782397696, 0, -19.877413425918157, 2624.2338339119883, 5.5, 1075 -10/02/2023 17:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/2.45086690611548, 6.6173406465117965, 0, 5195.953596727028, 10.156647121619411, 2643.554819913907 -10/02/2023 18:00, 243582f4-afb9-468f-86fe-48592468d9b2/75b9bab8-793f-4767-9b73-9c153d3727d1, 5/1.9161334104198904, 0, -15.329067283359123, 2595.8066705209944, 5.5, 1075 -10/02/2023 19:00, 243582f4-afb9-468f-86fe-48592468d9b2/75b9bab8-793f-4767-9b73-9c153d3727d1, 5/1.8183831374941901, 0, -14.547065099953521, 2590.9191568747096, 5.5, 1075 -10/02/2023 20:00, 243582f4-afb9-468f-86fe-48592468d9b2/75b9bab8-793f-4767-9b73-9c153d3727d1, 5/1.7785360300914501, 0, -14.228288240731601, 2588.9268015045727, 5.5, 1075 -10/02/2023 21:00, 243582f4-afb9-468f-86fe-48592468d9b2/75b9bab8-793f-4767-9b73-9c153d3727d1, 5/1.6820294220704497, 0, -13.456235376563598, 2584.1014711035223, 5.5, 1075 -10/02/2023 22:00, 243582f4-afb9-468f-86fe-48592468d9b2/75b9bab8-793f-4767-9b73-9c153d3727d1, 5/1.5642166068500902, 0, -12.513732854800722, 2578.2108303425043, 5.5, 1075 -10/02/2023 23:00, 75b9bab8-793f-4767-9b73-9c153d3727d1, 6.45589886225806, 0, -51.64719089806448, 322.794943112903, 0, 0 -11/02/2023 00:00, 243582f4-afb9-468f-86fe-48592468d9b2/75b9bab8-793f-4767-9b73-9c153d3727d1, 5/1.3503692443535096, 0, -10.802953954828077, 2567.5184622176753, 5.5, 1075 -11/02/2023 01:00, 243582f4-afb9-468f-86fe-48592468d9b2/75b9bab8-793f-4767-9b73-9c153d3727d1, 5/1.3142232174221702, 0, -10.513785739377361, 2565.7111608711084, 5.5, 1075 -11/02/2023 02:00, 243582f4-afb9-468f-86fe-48592468d9b2/75b9bab8-793f-4767-9b73-9c153d3727d1, 5/1.3738729536623397, 0, -10.990983629298718, 2568.693647683117, 5.5, 1075 -11/02/2023 03:00, 243582f4-afb9-468f-86fe-48592468d9b2/75b9bab8-793f-4767-9b73-9c153d3727d1, 5/1.4331526796195204, 0, -11.465221436956163, 2571.6576339809762, 5.5, 1075 -11/02/2023 04:00, 243582f4-afb9-468f-86fe-48592468d9b2/75b9bab8-793f-4767-9b73-9c153d3727d1, 5/2.0370820453929896, 0, -16.296656363143917, 2601.8541022696495, 5.5, 1075 -11/02/2023 05:00, 243582f4-afb9-468f-86fe-48592468d9b2/75b9bab8-793f-4767-9b73-9c153d3727d1, 5/1.96341746536043, 0, -15.70733972288344, 2598.1708732680213, 5.5, 1075 -11/02/2023 06:00, 243582f4-afb9-468f-86fe-48592468d9b2/75b9bab8-793f-4767-9b73-9c153d3727d1, 5/1.9607078889756702, 0, -15.685663111805361, 2598.0353944487833, 5.5, 1075 -11/02/2023 07:00, 243582f4-afb9-468f-86fe-48592468d9b2/75b9bab8-793f-4767-9b73-9c153d3727d1, 5/1.60601792010731, 0, -12.84814336085848, 2580.3008960053653, 5.5, 1075 -11/02/2023 08:00, 243582f4-afb9-468f-86fe-48592468d9b2/75b9bab8-793f-4767-9b73-9c153d3727d1, 5/1.8224191744462601, 0, -14.579353395570081, 2591.120958722313, 5.5, 1075 -11/02/2023 09:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.8888027479084304, 5.099767419352762, 0, 4577.683022699273, 9.088725221026017, 2283.833758661395 -11/02/2023 10:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.6916989976575696, 4.567587293675438, 0, 4360.868897423326, 8.714228095549382, 2157.6873585008443 -11/02/2023 11:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.6223997248967503, 4.380479257221226, 0, 4284.639697386425, 8.582559477303825, 2113.3358239339204 -11/02/2023 12:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.49733220911265, 4.042796964604155, 0, 4147.065430023915, 8.344931197314034, 2033.2926138320959 -11/02/2023 13:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.3951864180469498, 3.767003328726765, 0, 4034.705059851645, 8.150854194289204, 1967.919307550048 -11/02/2023 14:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.5774051953050803, 4.258994027323717, 0, 4235.1457148355885, 8.497069871079653, 2084.5393249952513 -11/02/2023 15:00, 243582f4-afb9-468f-86fe-48592468d9b2/75b9bab8-793f-4767-9b73-9c153d3727d1, 5/1.1997325073708396, 0, -9.597860058966717, 2559.986625368542, 5.5, 1075 -11/02/2023 16:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.2932444058375898, 3.4917598957614926, 0, 3922.568846421349, 7.95716437109142, 1902.6764197360576 -11/02/2023 17:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.0726719382135101, 2.8962142331764777, 0, 3679.9391320348614, 7.538076682605669, 1761.5100404566465 -11/02/2023 18:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.6666841952822, 9.72, 0, 5293.3420976411, 9.77335261481042, 2877.337101985673 -11/02/2023 19:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.6992057518770998, 9.72, 0, 5309.60287593855, 9.80912632706481, 2884.3292366535766 -11/02/2023 20:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.2483470616549903, 3.370537066468474, 0, 3873.1817678204893, 7.871859417144481, 1873.9421194591937 -11/02/2023 21:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.1639168316647703, 3.14257544549488, 0, 3780.3085148312475, 7.711441980163063, 1819.9067722654531 -11/02/2023 22:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.2335364269934797, 3.330548352882395, 0, 3856.8900696928276, 7.8437192112876115, 1864.463313275827 -11/02/2023 23:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.0851729453020598, 2.9299669523155614, 0, 3693.6902398322654, 7.561828596073914, 1769.5106849933181 -12/02/2023 00:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.4503335291345896, 9.72, 0, 5185.166764567295, 9.535366882048049, 2830.821708763937 -12/02/2023 01:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.44559443256007, 9.72, 0, 5182.797216280035, 9.530153875816076, 2829.802803000415 -12/02/2023 02:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.4633376388615997, 9.72, 0, 5191.6688194308, 9.549671402747759, 2833.6175923552437 -12/02/2023 03:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.6414380082914595, 9.72, 0, 5280.71900414573, 9.745581809120605, 2871.9091717826636 -12/02/2023 04:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.1472543331827, 9.72, 0, 5533.62716659135, 10.30197976650097, 2980.6596816342803 -12/02/2023 05:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.14447577743663, 9.72, 0, 5532.237888718315, 10.298923355180293, 2980.0622921488757 -12/02/2023 06:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.11525664502356, 9.72, 0, 5517.62832251178, 10.266782309525915, 2973.7801786800655 -12/02/2023 07:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.66579589021312, 9.72, 0, 5292.89794510656, 9.772375479234432, 2877.1461163958206 -12/02/2023 08:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.91262650811963, 9.72, 0, 5416.313254059814, 10.043889158931593, 2930.2146992457206 -12/02/2023 09:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.10843208457629, 9.72, 0, 5514.216042288145, 10.25927529303392, 2972.3128981839022 -12/02/2023 10:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.99454405272192, 9.72, 0, 5457.27202636096, 10.133998457994112, 2947.826971335213 -12/02/2023 11:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.81401449846162, 9.72, 0, 5367.00724923081, 9.935415948307782, 2909.0131171692483 -12/02/2023 12:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.2787251561193997, 3.4525579215223794, 0, 3906.5976717313397, 7.929577796626859, 1893.3840999164158 -12/02/2023 13:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.2614768497660398, 3.4059874943683077, 0, 3887.624534742644, 7.896806014555476, 1882.3451838502656 -12/02/2023 14:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.5266598209473798, 4.121981516557926, 0, 4179.3258030421175, 8.400653659800021, 2052.062285406323 -12/02/2023 15:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.4838851521738396, 4.006489910869368, 0, 4132.273667391224, 8.319381789130295, 2024.6864973912575 -12/02/2023 16:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.85064003311343, 9.72, 0, 5385.320016556715, 9.975704036424773, 2916.887607119387 -12/02/2023 17:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.5440147841570098, 9.72, 0, 5232.007392078505, 9.638416262572711, 2850.963178593757 -12/02/2023 18:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.6982917583521195, 9.72, 0, 5309.14587917606, 9.808120934187333, 2884.132728045706 -12/02/2023 19:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.5734569775565403, 9.72, 0, 5246.72848877827, 9.670802675312194, 2857.2932501746564 -12/02/2023 20:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.49662138398171, 9.72, 0, 5208.310691990855, 9.586283522379881, 2840.7735975560677 -12/02/2023 21:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.0931173978980402, 2.9514169743247085, 0, 3702.429137687844, 7.576923056006276, 1774.5951346547458 -12/02/2023 22:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.0875811251955598, 2.9364690380280116, 0, 3696.339237715116, 7.566404137871563, 1771.0519201251582 -12/02/2023 23:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.0284979341234104, 2.7769444221332082, 0, 3631.3477275357513, 7.45414607483448, 1733.2386778389828 -13/02/2023 00:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.0797698070592396, 2.9153784790599473, 0, 3687.7467877651634, 7.551562633412555, 1766.0526765179134 -13/02/2023 01:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.1794051273981703, 3.18439384397506, 0, 3797.345640137987, 7.740869742056523, 1829.8192815348289 -13/02/2023 02:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.2614536726943602, 3.4059249162747727, 0, 3887.5990399637963, 7.896761978119285, 1882.3303505243905 -13/02/2023 03:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.3944178127434501, 3.7649280944073156, 0, 4033.859594017795, 8.149393844212556, 1967.427400155808 -13/02/2023 04:00, 243582f4-afb9-468f-86fe-48592468d9b2/eba3befe-9c19-4d93-a71d-cc86df44ec15, 5/1.9610841912778199, 5.294927316450114, 0, 4657.192610405602, 9.226059963427858, 2330.0938824178047 -13/02/2023 05:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.4851325545340095, 9.72, 0, 5702.566277267005, 10.673645809987411, 3053.303499224812 -13/02/2023 06:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.73612105461465, 9.72, 0, 5828.060527307325, 10.949733160076114, 3107.2660267421497 -13/02/2023 07:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.23985373733044, 9.72, 0, 5579.926868665219, 10.403839111063483, 3000.5685535260445 -13/02/2023 08:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.34114238465204, 9.72, 0, 5630.5711923260205, 10.515256623117244, 3022.3456127001887 -13/02/2023 09:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.25568202342829, 9.72, 0, 5587.841011714145, 10.42125022577112, 3003.9716350370823 -13/02/2023 10:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.13377454111046, 9.72, 0, 5526.887270555229, 10.287151995221507, 2977.761526338749 -13/02/2023 11:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.85760504600101, 9.72, 0, 5388.802523000505, 9.98336555060111, 2918.385084890217 -13/02/2023 12:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.60548864889357, 9.72, 0, 5262.744324446785, 9.706037513782928, 2864.1800595121176 -13/02/2023 13:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.6620981195124, 9.72, 0, 5291.0490597562, 9.76830793146364, 2876.351095695166 -13/02/2023 14:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.7406551599147595, 9.72, 0, 5330.32757995738, 9.854720675906236, 2893.2408593816735 -13/02/2023 15:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.0588853322688796, 9.72, 0, 5489.44266613444, 10.204773865495767, 2961.660346437809 -13/02/2023 16:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.1108025411473403, 9.72, 0, 5515.40127057367, 10.261882795262075, 2972.8225463466783 -13/02/2023 17:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.2131980672505196, 9.72, 0, 5566.59903362526, 10.374517873975572, 2994.837584458862 -13/02/2023 18:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.8688391386275796, 9.72, 0, 5394.41956931379, 9.995723052490337, 2920.8004148049295 -13/02/2023 19:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.66217483871328, 9.72, 0, 5291.08741935664, 9.768392322584608, 2876.367590323355 -13/02/2023 20:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.59638780846092, 9.72, 0, 5258.19390423046, 9.696026589307012, 2862.223378819098 -13/02/2023 21:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.61941951546457, 9.72, 0, 5269.709757732285, 9.721361467011027, 2867.1751958248824 -13/02/2023 22:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.54776841795127, 9.72, 0, 5233.884208975635, 9.642545259746397, 2851.770209859523 -13/02/2023 23:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.5939189723059903, 9.72, 0, 5256.959486152995, 9.693310869536589, 2861.692579045788 -14/02/2023 00:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.55019200502873, 9.72, 0, 5235.096002514365, 9.645211205531602, 2852.2912810811767 -14/02/2023 01:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.73419090772549, 9.72, 0, 5327.095453862745, 9.847609998498038, 2891.8510451609804 -14/02/2023 02:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.71576259794447, 9.72, 0, 5317.8812989722355, 9.827338857738917, 2887.888958558061 -14/02/2023 03:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.78203609004021, 9.72, 0, 5351.018045020105, 9.900239699044231, 2902.1377593586453 -14/02/2023 04:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.42338449507607, 9.72, 0, 5671.692247538035, 10.605722944583677, 3040.027666441355 -14/02/2023 05:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.61397695203781, 9.72, 0, 5766.988476018905, 10.81537464724159, 3081.005044688129 -14/02/2023 06:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.7962422692743902, 9.72, 0, 5858.121134637195, 11.01586649620183, 3120.1920878939936 -14/02/2023 07:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.3237910069171597, 9.72, 0, 5621.89550345858, 10.496170107608876, 3018.6150664871893 -14/02/2023 08:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.4571404962555596, 9.72, 0, 5688.57024812778, 10.642854545881116, 3047.2852066949454 -14/02/2023 09:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.4161844196303703, 9.72, 0, 5668.092209815185, 10.597802861593408, 3038.4796502205295 -14/02/2023 10:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.5238721008774996, 9.72, 0, 5721.93605043875, 10.716259310965249, 3061.632501688662 -14/02/2023 11:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.47641715822803, 9.72, 0, 5698.208579114015, 10.664058874050832, 3051.4296890190262 -14/02/2023 12:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.48346332403792, 9.72, 0, 5701.7316620189595, 10.671809656441713, 3052.944614668153 -14/02/2023 13:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.3982021751631595, 9.72, 0, 5659.10108758158, 10.578022392679475, 3034.6134676600796 -14/02/2023 14:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.04338125435406, 9.72, 0, 5481.69062717703, 10.187719379789467, 2958.326969686123 -14/02/2023 15:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.49110767186721, 9.72, 0, 5705.553835933605, 10.680218439053931, 3054.58814945145 -14/02/2023 16:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.4716468378175596, 9.72, 0, 5695.82341890878, 10.658811521599315, 3050.4040701307754 -14/02/2023 17:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/3.4339406766374903, 9.72, 0, 5676.970338318745, 10.617334744301239, 3042.2972454770606 -14/02/2023 18:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.9302013586677496, 9.72, 0, 5425.100679333875, 10.063221494534524, 2933.993292113566 -14/02/2023 19:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.7820273280787498, 9.72, 0, 5351.013664039375, 9.900230060886624, 2902.135875536931 -14/02/2023 20:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.9124517742644396, 9.72, 0, 5416.22588713222, 10.043696951690883, 2930.1771314668545 -14/02/2023 21:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.7414254296525296, 9.72, 0, 5330.712714826264, 9.855567972617783, 2893.4064673752937 -14/02/2023 22:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.8086483940551, 9.72, 0, 5364.32419702755, 9.92951323346061, 2907.8594047218467 -14/02/2023 23:00, eba3befe-9c19-4d93-a71d-cc86df44ec15/243582f4-afb9-468f-86fe-48592468d9b2, 3.6/2.7471732405047997, 9.72, 0, 5333.586620252399, 9.86189056455528, 2894.642246708532 +12/07/2023 00:00, 5a52020b-7984-4b81-bba8-543a20c780a8/6c2ac34b-0b73-43da-8a8e-a5394cec8bac, 1/0.7017493827936401, 1.8947233335428284, 0, 1271.9243210730042, 2.433323827307916, 664.1196049879296 +12/07/2023 01:00, 5a52020b-7984-4b81-bba8-543a20c780a8/6c2ac34b-0b73-43da-8a8e-a5394cec8bac, 1/0.6625907336354899, 1.788994980815823, 0, 1228.849806999039, 2.358922393907431, 639.0580695267136 +12/07/2023 02:00, 5a52020b-7984-4b81-bba8-543a20c780a8/6c2ac34b-0b73-43da-8a8e-a5394cec8bac, 1/0.6208682065197499, 1.676344157603325, 0, 1182.9550271717249, 2.279649592387525, 612.35565217264 +12/07/2023 03:00, 5a52020b-7984-4b81-bba8-543a20c780a8/6c2ac34b-0b73-43da-8a8e-a5394cec8bac, 1/0.5500337539861, 1.48509113576247, 0, 1105.03712938471, 2.14506413257359, 567.021602551104 +12/07/2023 04:00, 5a52020b-7984-4b81-bba8-543a20c780a8/9455cc74-4db0-4b83-9e29-c81e3ef967dd, 1/0.5751642050213299, 0, -4.601313640170639, 528.7582102510665, 1.1, 215 +12/07/2023 05:00, 5a52020b-7984-4b81-bba8-543a20c780a8/9455cc74-4db0-4b83-9e29-c81e3ef967dd, 1/0.60583058289243, 0, -4.84664466313944, 530.2915291446214, 1.1, 215 +12/07/2023 06:00, 5a52020b-7984-4b81-bba8-543a20c780a8/6c2ac34b-0b73-43da-8a8e-a5394cec8bac, 1/0.6590962880337199, 1.7795599776910438, 0, 1225.0059168370917, 2.352282947264068, 636.8216243415807 +12/07/2023 07:00, 6c2ac34b-0b73-43da-8a8e-a5394cec8bac, 1.74834920843542, 4.720542862775634, 0, 1923.184129278962, 3.321863496027298, 1118.9434933986688 +12/07/2023 08:00, 6c2ac34b-0b73-43da-8a8e-a5394cec8bac, 1.77894505102429, 4.803151637765583, 0, 1956.839556126719, 3.379995596946151, 1138.5248326555457 +12/07/2023 09:00, 5a52020b-7984-4b81-bba8-543a20c780a8/6c2ac34b-0b73-43da-8a8e-a5394cec8bac, 1/0.7598770840669999, 2.0516681269809, 0, 1335.8647924737, 2.5437664597273, 701.32133380288 +12/07/2023 10:00, 5a52020b-7984-4b81-bba8-543a20c780a8/6c2ac34b-0b73-43da-8a8e-a5394cec8bac, 1/0.75827370736096, 2.0473390098745923, 0, 1334.101078097056, 2.540720043985824, 700.2951727110144 +12/07/2023 11:00, 9455cc74-4db0-4b83-9e29-c81e3ef967dd, 1.93651029330016, 0, -15.49208234640128, 96.825514665008, 0, 0 +12/07/2023 12:00, 9455cc74-4db0-4b83-9e29-c81e3ef967dd, 1.86479634478317, 0, -14.91837075826536, 93.2398172391585, 0, 0 +12/07/2023 13:00, 9455cc74-4db0-4b83-9e29-c81e3ef967dd, 1.79187768612226, 0, -14.33502148897808, 89.593884306113, 0, 0 +12/07/2023 14:00, 9455cc74-4db0-4b83-9e29-c81e3ef967dd, 1.62024219628394, 0, -12.96193757027152, 81.012109814197, 0, 0 +12/07/2023 15:00, 9455cc74-4db0-4b83-9e29-c81e3ef967dd, 1.54639363157213, 0, -12.37114905257704, 77.3196815786065, 0, 0 +12/07/2023 16:00, 9455cc74-4db0-4b83-9e29-c81e3ef967dd, 1.54747325443195, 0, -12.3797860354556, 77.3736627215975, 0, 0 +12/07/2023 17:00, 9455cc74-4db0-4b83-9e29-c81e3ef967dd, 1.52600660564224, 0, -12.20805284513792, 76.300330282112, 0, 0 +12/07/2023 18:00, 9455cc74-4db0-4b83-9e29-c81e3ef967dd, 1.56195037459559, 0, -12.49560299676472, 78.09751872977951, 0, 0 +12/07/2023 19:00, 5a52020b-7984-4b81-bba8-543a20c780a8/6c2ac34b-0b73-43da-8a8e-a5394cec8bac, 1/0.5921720111722399, 1.5988644301650479, 0, 1151.389212289464, 2.225126821227256, 593.9900871502335 +12/07/2023 20:00, 6c2ac34b-0b73-43da-8a8e-a5394cec8bac, 1.60826849446257, 4.342324935048939, 0, 1769.095343908827, 3.055710139478883, 1029.2918364560448 +12/07/2023 21:00, 6c2ac34b-0b73-43da-8a8e-a5394cec8bac, 1.61310618264305, 4.355386693136235, 0, 1774.4168009073549, 3.064901747021795, 1032.387956891552 +12/07/2023 22:00, 6c2ac34b-0b73-43da-8a8e-a5394cec8bac, 1.66511050764097, 4.495798370630619, 0, 1831.621558405067, 3.163709964517843, 1065.6707248902208 +12/07/2023 23:00, 6c2ac34b-0b73-43da-8a8e-a5394cec8bac, 1.66089806458275, 4.484424774373426, 0, 1826.987871041025, 3.155706322707225, 1062.97476133296 +13/07/2023 00:00, 5a52020b-7984-4b81-bba8-543a20c780a8/6c2ac34b-0b73-43da-8a8e-a5394cec8bac, 1/0.66950710555626, 1.8076691850019022, 0, 1236.4578161118861, 2.3720635005568944, 643.4845475560064 +13/07/2023 01:00, 5a52020b-7984-4b81-bba8-543a20c780a8/6c2ac34b-0b73-43da-8a8e-a5394cec8bac, 1/0.6458717044306499, 1.7438536019627549, 0, 1210.4588748737149, 2.327156238418235, 628.357890835616 +13/07/2023 02:00, 5a52020b-7984-4b81-bba8-543a20c780a8/9455cc74-4db0-4b83-9e29-c81e3ef967dd, 1/0.59741038843301, 0, -4.77928310746408, 529.8705194216504, 1.1, 215 +13/07/2023 03:00, 5a52020b-7984-4b81-bba8-543a20c780a8/9455cc74-4db0-4b83-9e29-c81e3ef967dd, 1/0.5513177221727401, 0, -4.410541777381921, 527.565886108637, 1.1, 215 +13/07/2023 04:00, 5a52020b-7984-4b81-bba8-543a20c780a8/9455cc74-4db0-4b83-9e29-c81e3ef967dd, 1/0.59598054296527, 0, -4.76784434372216, 529.7990271482635, 1.1, 215 +13/07/2023 05:00, 5a52020b-7984-4b81-bba8-543a20c780a8/6c2ac34b-0b73-43da-8a8e-a5394cec8bac, 1/0.6830831770335299, 1.844324577990531, 0, 1251.391494736883, 2.397858036363707, 652.1732333014592 +13/07/2023 06:00, 5a52020b-7984-4b81-bba8-543a20c780a8/6c2ac34b-0b73-43da-8a8e-a5394cec8bac, 1/0.7064484546493199, 1.907410827553164, 0, 1277.093300114252, 2.442252063833708, 667.1270109755648 +13/07/2023 07:00, 6c2ac34b-0b73-43da-8a8e-a5394cec8bac, 1.77660870139374, 4.796843493763098, 0, 1954.269571533114, 3.3755565326481056, 1137.0295688919937 +13/07/2023 08:00, 6c2ac34b-0b73-43da-8a8e-a5394cec8bac, 2.03785536729561, 5.502209491698147, 0, 2241.640904025171, 3.8719251978616587, 1304.2274350691903 +13/07/2023 09:00, 5a52020b-7984-4b81-bba8-543a20c780a8/6c2ac34b-0b73-43da-8a8e-a5394cec8bac, 1/1.0196924880849698, 2.7531697178294188, 0, 1621.6617368934667, 3.0374157273614424, 867.6031923743807 +13/07/2023 10:00, 9455cc74-4db0-4b83-9e29-c81e3ef967dd, 1.79550575678918, 0, -14.36404605431344, 89.775287839459, 0, 0 +13/07/2023 11:00, 9455cc74-4db0-4b83-9e29-c81e3ef967dd, 1.72768111279613, 0, -13.82144890236904, 86.3840556398065, 0, 0 +13/07/2023 12:00, 9455cc74-4db0-4b83-9e29-c81e3ef967dd, 1.72036180933363, 0, -13.76289447466904, 86.0180904666815, 0, 0 +13/07/2023 13:00, 9455cc74-4db0-4b83-9e29-c81e3ef967dd, 1.62077585083134, 0, -12.96620680665072, 81.03879254156699, 0, 0 +13/07/2023 14:00, 9455cc74-4db0-4b83-9e29-c81e3ef967dd, 1.62425345600837, 0, -12.99402764806696, 81.21267280041849, 0, 0 +13/07/2023 15:00, 9455cc74-4db0-4b83-9e29-c81e3ef967dd, 1.66559685731477, 0, -13.32477485851816, 83.2798428657385, 0, 0 +13/07/2023 16:00, 9455cc74-4db0-4b83-9e29-c81e3ef967dd, 1.60884641397927, 0, -12.87077131183416, 80.4423206989635, 0, 0 +13/07/2023 17:00, 9455cc74-4db0-4b83-9e29-c81e3ef967dd, 1.64638112066527, 0, -13.17104896532216, 82.31905603326351, 0, 0 +13/07/2023 18:00, 9455cc74-4db0-4b83-9e29-c81e3ef967dd, 1.64835755193657, 0, -13.18686041549256, 82.4178775968285, 0, 0 +13/07/2023 19:00, 6c2ac34b-0b73-43da-8a8e-a5394cec8bac, 1.67196529275146, 4.514306290428943, 0, 1839.1618220266062, 3.176734056227774, 1070.0577873609345 +13/07/2023 20:00, 6c2ac34b-0b73-43da-8a8e-a5394cec8bac, 1.67774957531664, 4.529923853354928, 0, 1845.524532848304, 3.187724193101616, 1073.7597282026495 +13/07/2023 21:00, 6c2ac34b-0b73-43da-8a8e-a5394cec8bac, 1.61935921163387, 4.372269871411449, 0, 1781.2951327972569, 3.076782502104353, 1036.3898954456768 +13/07/2023 22:00, 6c2ac34b-0b73-43da-8a8e-a5394cec8bac, 1.61229482428074, 4.353196025557998, 0, 1773.524306708814, 3.063360166133406, 1031.8686875396736 diff --git a/HeatOptimiser/data/source_data.csv b/HeatOptimiser/data/source_data.csv index e3a2afd..e69de29 100644 --- a/HeatOptimiser/data/source_data.csv +++ b/HeatOptimiser/data/source_data.csv @@ -1,169 +0,0 @@ -TimeFrom,TimeTo,HeatDemand,ElectricityPrice -08/07/2023 00:00:00,08/07/2023 01:00:00,1.78828799135327,752.03 -08/07/2023 01:00:00,08/07/2023 02:00:00,1.84637663883401,691.05 -08/07/2023 02:00:00,08/07/2023 03:00:00,1.75896183191617,674.78 -08/07/2023 03:00:00,08/07/2023 04:00:00,1.67434521269652,652.95 -08/07/2023 04:00:00,08/07/2023 05:00:00,1.72864449458109,666.3 -08/07/2023 05:00:00,08/07/2023 06:00:00,1.79215649178512,654.6 -08/07/2023 06:00:00,08/07/2023 07:00:00,1.82117949774749,637.05 -08/07/2023 07:00:00,08/07/2023 08:00:00,1.80878929620697,639.45 -08/07/2023 08:00:00,08/07/2023 09:00:00,1.84469760429621,628.28 -08/07/2023 09:00:00,08/07/2023 10:00:00,1.88067201549828,570.3 -08/07/2023 10:00:00,08/07/2023 11:00:00,1.99815238987479,456.75 -08/07/2023 11:00:00,08/07/2023 12:00:00,1.86386551435451,347.4 -08/07/2023 12:00:00,08/07/2023 13:00:00,1.78420976288822,264.15 -08/07/2023 13:00:00,08/07/2023 14:00:00,1.59978807420697,125.33 -08/07/2023 14:00:00,08/07/2023 15:00:00,1.56695389082942,125.48 -08/07/2023 15:00:00,08/07/2023 16:00:00,1.54641284335269,300 -08/07/2023 16:00:00,08/07/2023 17:00:00,1.57361798739109,456.75 -08/07/2023 17:00:00,08/07/2023 18:00:00,1.53105864967969,625.5 -08/07/2023 18:00:00,08/07/2023 19:00:00,1.51917793953478,804.75 -08/07/2023 19:00:00,08/07/2023 20:00:00,1.49885585253934,907.5 -08/07/2023 20:00:00,08/07/2023 21:00:00,1.49700112961193,965.7 -08/07/2023 21:00:00,08/07/2023 22:00:00,1.48267035054386,996.45 -08/07/2023 22:00:00,08/07/2023 23:00:00,1.51357013640556,972.9 -08/07/2023 23:00:00,09/07/2023 00:00:00,1.55241725833873,869.4 -09/07/2023 00:00:00,09/07/2023 01:00:00,1.54008188240833,820.8 -09/07/2023 01:00:00,09/07/2023 02:00:00,1.47314557397094,763.05 -09/07/2023 02:00:00,09/07/2023 03:00:00,1.40907597202559,763.65 -09/07/2023 03:00:00,09/07/2023 04:00:00,1.43413764614092,715.8 -09/07/2023 04:00:00,09/07/2023 05:00:00,1.43149262098723,718.43 -09/07/2023 05:00:00,09/07/2023 06:00:00,1.45370505963213,726.9 -09/07/2023 06:00:00,09/07/2023 07:00:00,1.46829446963973,710.1 -09/07/2023 07:00:00,09/07/2023 08:00:00,1.50459918683688,684 -09/07/2023 08:00:00,09/07/2023 09:00:00,1.61977439215011,646.8 -09/07/2023 09:00:00,09/07/2023 10:00:00,1.69969265462935,578.33 -09/07/2023 10:00:00,09/07/2023 11:00:00,1.7352690870091,450.9 -09/07/2023 11:00:00,09/07/2023 12:00:00,1.67864071970642,375.9 -09/07/2023 12:00:00,09/07/2023 13:00:00,1.57576078041169,342.68 -09/07/2023 13:00:00,09/07/2023 14:00:00,1.45441596678747,277.43 -09/07/2023 14:00:00,09/07/2023 15:00:00,1.43256808249907,336.38 -09/07/2023 15:00:00,09/07/2023 16:00:00,1.41968538275977,413.63 -09/07/2023 16:00:00,09/07/2023 17:00:00,1.46851384683993,547.35 -09/07/2023 17:00:00,09/07/2023 18:00:00,1.46304039882388,618 -09/07/2023 18:00:00,09/07/2023 19:00:00,1.49863453782035,783.08 -09/07/2023 19:00:00,09/07/2023 20:00:00,1.49772745772852,916.58 -09/07/2023 20:00:00,09/07/2023 21:00:00,1.43725936709073,990 -09/07/2023 21:00:00,09/07/2023 22:00:00,1.44518423204495,1005.75 -09/07/2023 22:00:00,09/07/2023 23:00:00,1.43692709461629,990.9 -09/07/2023 23:00:00,10/07/2023 00:00:00,1.47140278875152,897 -10/07/2023 00:00:00,10/07/2023 01:00:00,1.40136368294974,843.68 -10/07/2023 01:00:00,10/07/2023 02:00:00,1.3210797670177,765 -10/07/2023 02:00:00,10/07/2023 03:00:00,1.28290495727698,707.25 -10/07/2023 03:00:00,10/07/2023 04:00:00,1.32722672090925,689.55 -10/07/2023 04:00:00,10/07/2023 05:00:00,1.35111119407094,699.83 -10/07/2023 05:00:00,10/07/2023 06:00:00,1.35117361752636,788.55 -10/07/2023 06:00:00,10/07/2023 07:00:00,1.42453681249605,912.53 -10/07/2023 07:00:00,10/07/2023 08:00:00,1.49408335760136,995.85 -10/07/2023 08:00:00,10/07/2023 09:00:00,1.54993477850603,1007.03 -10/07/2023 09:00:00,10/07/2023 10:00:00,1.58001206248211,884.63 -10/07/2023 10:00:00,10/07/2023 11:00:00,1.67833484202657,789.6 -10/07/2023 11:00:00,10/07/2023 12:00:00,1.72895255881952,712.43 -10/07/2023 12:00:00,10/07/2023 13:00:00,1.67805063262635,669.23 -10/07/2023 13:00:00,10/07/2023 14:00:00,1.61536605554289,601.2 -10/07/2023 14:00:00,10/07/2023 15:00:00,1.5074154468435,483.53 -10/07/2023 15:00:00,10/07/2023 16:00:00,1.52948316174845,463.58 -10/07/2023 16:00:00,10/07/2023 17:00:00,1.45593532444073,472.05 -10/07/2023 17:00:00,10/07/2023 18:00:00,1.50840058630215,602.7 -10/07/2023 18:00:00,10/07/2023 19:00:00,1.54657885500802,914.78 -10/07/2023 19:00:00,10/07/2023 20:00:00,1.53230209895465,1241.18 -10/07/2023 20:00:00,10/07/2023 21:00:00,1.50010627540284,1319.18 -10/07/2023 21:00:00,10/07/2023 22:00:00,1.48652859588332,1350.53 -10/07/2023 22:00:00,10/07/2023 23:00:00,1.466632220848,1221.9 -10/07/2023 23:00:00,11/07/2023 00:00:00,1.57476105027669,1002.75 -11/07/2023 00:00:00,11/07/2023 01:00:00,1.5323568537871,933.08 -11/07/2023 01:00:00,11/07/2023 02:00:00,1.53754412783808,868.05 -11/07/2023 02:00:00,11/07/2023 03:00:00,1.41746226803164,789.68 -11/07/2023 03:00:00,11/07/2023 04:00:00,1.46420411025763,755.1 -11/07/2023 04:00:00,11/07/2023 05:00:00,1.48314432657739,747.75 -11/07/2023 05:00:00,11/07/2023 06:00:00,1.55754474958658,845.55 -11/07/2023 06:00:00,11/07/2023 07:00:00,1.59655856507739,926.63 -11/07/2023 07:00:00,11/07/2023 08:00:00,1.6807632945627,940.43 -11/07/2023 08:00:00,11/07/2023 09:00:00,1.79642599755559,907.13 -11/07/2023 09:00:00,11/07/2023 10:00:00,1.77807657218847,788.25 -11/07/2023 10:00:00,11/07/2023 11:00:00,1.82929383454807,686.78 -11/07/2023 11:00:00,11/07/2023 12:00:00,1.92402220975167,489.38 -11/07/2023 12:00:00,11/07/2023 13:00:00,1.93474717730012,422.85 -11/07/2023 13:00:00,11/07/2023 14:00:00,1.91421313834336,347.93 -11/07/2023 14:00:00,11/07/2023 15:00:00,1.71734898052501,355.43 -11/07/2023 15:00:00,11/07/2023 16:00:00,1.64110197393576,434.1 -11/07/2023 16:00:00,11/07/2023 17:00:00,1.59307516955627,510 -11/07/2023 17:00:00,11/07/2023 18:00:00,1.52811625845578,698.4 -11/07/2023 18:00:00,11/07/2023 19:00:00,1.6056144386673,855 -11/07/2023 19:00:00,11/07/2023 20:00:00,1.69002163480209,1061.63 -11/07/2023 20:00:00,11/07/2023 21:00:00,1.64880506354484,1200.15 -11/07/2023 21:00:00,11/07/2023 22:00:00,1.62386845815698,1005.68 -11/07/2023 22:00:00,11/07/2023 23:00:00,1.55593973588275,892.5 -11/07/2023 23:00:00,12/07/2023 00:00:00,1.62436262943738,772.73 -12/07/2023 00:00:00,12/07/2023 01:00:00,1.70174938279364,738.53 -12/07/2023 01:00:00,12/07/2023 02:00:00,1.66259073363549,682.5 -12/07/2023 02:00:00,12/07/2023 03:00:00,1.62086820651975,675 -12/07/2023 03:00:00,12/07/2023 04:00:00,1.5500337539861,615.68 -12/07/2023 04:00:00,12/07/2023 05:00:00,1.57516420502133,580.5 -12/07/2023 05:00:00,12/07/2023 06:00:00,1.60583058289243,570 -12/07/2023 06:00:00,12/07/2023 07:00:00,1.65909628803372,661.65 -12/07/2023 07:00:00,12/07/2023 08:00:00,1.74834920843542,865.5 -12/07/2023 08:00:00,12/07/2023 09:00:00,1.77894505102429,900 -12/07/2023 09:00:00,12/07/2023 10:00:00,1.759877084067,767.48 -12/07/2023 10:00:00,12/07/2023 11:00:00,1.75827370736096,622.5 -12/07/2023 11:00:00,12/07/2023 12:00:00,1.93651029330016,380.78 -12/07/2023 12:00:00,12/07/2023 13:00:00,1.86479634478317,119.03 -12/07/2023 13:00:00,12/07/2023 14:00:00,1.79187768612226,96.9 -12/07/2023 14:00:00,12/07/2023 15:00:00,1.62024219628394,144.98 -12/07/2023 15:00:00,12/07/2023 16:00:00,1.54639363157213,202.73 -12/07/2023 16:00:00,12/07/2023 17:00:00,1.54747325443195,221.18 -12/07/2023 17:00:00,12/07/2023 18:00:00,1.52600660564224,328.65 -12/07/2023 18:00:00,12/07/2023 19:00:00,1.56195037459559,375.45 -12/07/2023 19:00:00,12/07/2023 20:00:00,1.59217201117224,601.95 -12/07/2023 20:00:00,12/07/2023 21:00:00,1.60826849446257,1043.25 -12/07/2023 21:00:00,12/07/2023 22:00:00,1.61310618264305,939 -12/07/2023 22:00:00,12/07/2023 23:00:00,1.66511050764097,945.08 -12/07/2023 23:00:00,13/07/2023 00:00:00,1.66089806458275,854.33 -13/07/2023 00:00:00,13/07/2023 01:00:00,1.66950710555626,786.9 -13/07/2023 01:00:00,13/07/2023 02:00:00,1.64587170443065,642.45 -13/07/2023 02:00:00,13/07/2023 03:00:00,1.59741038843301,592.5 -13/07/2023 03:00:00,13/07/2023 04:00:00,1.55131772217274,563.18 -13/07/2023 04:00:00,13/07/2023 05:00:00,1.59598054296527,570 -13/07/2023 05:00:00,13/07/2023 06:00:00,1.68308317703353,663.83 -13/07/2023 06:00:00,13/07/2023 07:00:00,1.70644845464932,766.73 -13/07/2023 07:00:00,13/07/2023 08:00:00,1.77660870139374,828.53 -13/07/2023 08:00:00,13/07/2023 09:00:00,2.03785536729561,893.25 -13/07/2023 09:00:00,13/07/2023 10:00:00,2.01969248808497,652.2 -13/07/2023 10:00:00,13/07/2023 11:00:00,1.79550575678918,365.78 -13/07/2023 11:00:00,13/07/2023 12:00:00,1.72768111279613,356.93 -13/07/2023 12:00:00,13/07/2023 13:00:00,1.72036180933363,370.43 -13/07/2023 13:00:00,13/07/2023 14:00:00,1.62077585083134,348.75 -13/07/2023 14:00:00,13/07/2023 15:00:00,1.62425345600837,348.75 -13/07/2023 15:00:00,13/07/2023 16:00:00,1.66559685731477,350.63 -13/07/2023 16:00:00,13/07/2023 17:00:00,1.60884641397927,338.03 -13/07/2023 17:00:00,13/07/2023 18:00:00,1.64638112066527,351.98 -13/07/2023 18:00:00,13/07/2023 19:00:00,1.64835755193657,417.68 -13/07/2023 19:00:00,13/07/2023 20:00:00,1.67196529275146,867.23 -13/07/2023 20:00:00,13/07/2023 21:00:00,1.67774957531664,981.45 -13/07/2023 21:00:00,13/07/2023 22:00:00,1.61935921163387,1034.18 -13/07/2023 22:00:00,13/07/2023 23:00:00,1.61229482428074,972.53 -13/07/2023 23:00:00,14/07/2023 00:00:00,1.69600087121924,882.9 -14/07/2023 00:00:00,14/07/2023 01:00:00,1.71331198241022,757.5 -14/07/2023 01:00:00,14/07/2023 02:00:00,1.75085867485715,722.7 -14/07/2023 02:00:00,14/07/2023 03:00:00,1.66397762462146,634.13 -14/07/2023 03:00:00,14/07/2023 04:00:00,1.63872711862981,626.85 -14/07/2023 04:00:00,14/07/2023 05:00:00,1.69680825676276,700.13 -14/07/2023 05:00:00,14/07/2023 06:00:00,1.77842135130174,745.13 -14/07/2023 06:00:00,14/07/2023 07:00:00,1.79864241036375,855 -14/07/2023 07:00:00,14/07/2023 08:00:00,1.77752776127147,855 -14/07/2023 08:00:00,14/07/2023 09:00:00,1.8207566054068,778.2 -14/07/2023 09:00:00,14/07/2023 10:00:00,1.89630827182055,638.03 -14/07/2023 10:00:00,14/07/2023 11:00:00,1.86086861223585,597.83 -14/07/2023 11:00:00,14/07/2023 12:00:00,1.88321642243266,572.93 -14/07/2023 12:00:00,14/07/2023 13:00:00,1.83121324247294,553.5 -14/07/2023 13:00:00,14/07/2023 14:00:00,1.76377507921298,523.88 -14/07/2023 14:00:00,14/07/2023 15:00:00,1.62744217537165,563.48 -14/07/2023 15:00:00,14/07/2023 16:00:00,1.57371724757784,582.75 -14/07/2023 16:00:00,14/07/2023 17:00:00,1.5548033438268,581.63 -14/07/2023 17:00:00,14/07/2023 18:00:00,1.53546388736619,730.95 -14/07/2023 18:00:00,14/07/2023 19:00:00,1.55567182364457,864.38 -14/07/2023 19:00:00,14/07/2023 20:00:00,1.55821795912723,1051.43 -14/07/2023 20:00:00,14/07/2023 21:00:00,1.5890684155839,1049.4 -14/07/2023 21:00:00,14/07/2023 22:00:00,1.57092506929298,929.4 -14/07/2023 22:00:00,14/07/2023 23:00:00,1.54527243812263,714.38 -14/07/2023 23:00:00,15/07/2023 00:00:00,1.62241089322521,607.05