public List <ValueSerie> RetrieveQboxSeries(RetrieveSeriesParameters parameters) { var resultSeries = new List <ValueSerie>(); Dictionary <int, IList <SeriesValue> > counterSeriesList = GetSeriesAtCounterLevel(parameters); var usageEnergyType = DeviceEnergyType.Consumption; foreach (var(counterId, counterSeries) in counterSeriesList) { var valueSerie = new ValueSerie { Data = counterSeries.ToList() }; valueSerie.Total = valueSerie.Data.Sum(d => d.Value ?? 0); switch (counterId) { case 181: // consumption low valueSerie.EnergyType = DeviceEnergyType.NetLow; AddSerieToResult(valueSerie, resultSeries, usageEnergyType); break; case 182: // consumption high valueSerie.EnergyType = DeviceEnergyType.NetHigh; AddSerieToResult(valueSerie, resultSeries, usageEnergyType); break; case 281: // generation low valueSerie.EnergyType = DeviceEnergyType.NetLow; valueSerie.Data.ForEach(d => d.Value *= -1); AddSerieToResult(valueSerie, resultSeries, usageEnergyType); break; case 282: // generation high valueSerie.EnergyType = DeviceEnergyType.NetHigh; valueSerie.Data.ForEach(d => d.Value *= -1); AddSerieToResult(valueSerie, resultSeries, usageEnergyType); break; case 2421: // gas if (valueSerie.Data.Sum(d => d.Value ?? 0) == 0 && valueSerie.Data.Any(d => !d.Value.HasValue)) { break; //there is a gas counter but no data found or file found, so not monitored } valueSerie.EnergyType = DeviceEnergyType.Gas; AddSerieToResult(valueSerie, resultSeries, null); break; case 1: // net but also generation??? valueSerie.EnergyType = usageEnergyType; AddSerieToResult(valueSerie, resultSeries, null); break; case 3: //net valueSerie.EnergyType = usageEnergyType; valueSerie.Data.ForEach(d => d.Value *= -1); AddSerieToResult(valueSerie, resultSeries, null); break; case GenerationCounterId: //this is a fake counter that has been built to contain S0 (generation) data, //it is set in GetSeriesAtCounterLevel() at the top of that function valueSerie.EnergyType = DeviceEnergyType.Generation; AddSerieToResult(valueSerie, resultSeries, null); break; default: Logger.LogError("Invalid counter id : {0}", counterId); break; } } return(resultSeries); }
protected bool Equals(ValueSerie other) { return(EnergyType == other.EnergyType && Data.SequenceEqual(other.Data)); }
private static void AddSerieToResult(ValueSerie inSerie, List <ValueSerie> ioResultSeries, DeviceEnergyType?inSecondaryEnergyType) { if (inSerie.Data == null) { return; } if (ioResultSeries.Any(s => s.EnergyType == inSerie.EnergyType)) { var existingSerie = ioResultSeries.First(s => s.EnergyType == inSerie.EnergyType); var serieIndexFinder = new SerieIndexFinder(existingSerie.Data); foreach (var slotToAdd in inSerie.Data) { var index = serieIndexFinder.GetIndex(slotToAdd.Begin); if (index < 0) { existingSerie.Data.Add(slotToAdd); } else { var slot = existingSerie.Data[index]; if (!slot.Value.HasValue || slot.Value == 0) { slot.Value = slotToAdd.Value; } else { slot.Value += slotToAdd.Value ?? 0; } } } existingSerie.Total = existingSerie.Data.Sum(d => d.Value ?? 0); } else { ioResultSeries.Add(inSerie); } // used to accumulate series to one type: if (inSecondaryEnergyType.HasValue) { var serie = new ValueSerie() { EnergyType = inSecondaryEnergyType.Value, Name = inSerie.Name, Data = new List <SeriesValue>() }; foreach (var data in inSerie.Data) { var seriesValue = new SeriesValue() { Begin = new DateTime(data.Begin.Ticks), End = new DateTime(data.End.Ticks), Value = data.Value }; serie.Data.Add(seriesValue); } serie.Total = serie.Data.Sum(d => d.Value ?? 0); AddSerieToResult(serie, ioResultSeries, null); } }