using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace PlantBox.Broker { class HistoricManager { [JsonProperty(PropertyName = nameof(MinutesHistoric))] private List _minutesHistoric; [JsonIgnore] public IReadOnlyList MinutesHistoric => _minutesHistoric.AsReadOnly(); [JsonProperty(PropertyName = nameof(HoursHistoric))] private List _hoursHistoric; [JsonIgnore] public IReadOnlyList HoursHistoric => _hoursHistoric.AsReadOnly(); [JsonProperty(PropertyName = nameof(DaysHistoric))] private List _daysHistoric; [JsonIgnore] public IReadOnlyList DaysHistoric => _daysHistoric.AsReadOnly(); [JsonProperty(PropertyName = nameof(WeeksHistoric))] private List _weeksHistoric; [JsonIgnore] public IReadOnlyList WeeksHistoric => _weeksHistoric.AsReadOnly(); [JsonProperty(PropertyName = nameof(MonthsHistoric))] private List _monthsHistoric; [JsonIgnore] public IReadOnlyList MonthsHistoric => _monthsHistoric.AsReadOnly(); public HistoricManager() { _minutesHistoric = new List(); _hoursHistoric = new List(); _daysHistoric = new List(); _weeksHistoric = new List(); _monthsHistoric = new List(); } public HistoricManager(List minutesHistoric, List hoursHistoric, List daysHistoric, List weeksHistoric, List monthsHistoric) { _minutesHistoric = minutesHistoric; _hoursHistoric = hoursHistoric; _daysHistoric = daysHistoric; _weeksHistoric = weeksHistoric; _monthsHistoric = monthsHistoric; } public void Add(CaptorsValue captorsValue) { _minutesHistoric.Add(captorsValue); if (_minutesHistoric.Count % 12 == 0) { _hoursHistoric.Add(new CaptorsValue(GetAverage(_minutesHistoric.TakeFromEnd(12)))); } if (_hoursHistoric.Count % 24 == 0) { _daysHistoric.Add(new CaptorsValue(GetAverage(_hoursHistoric.TakeFromEnd(24)))); } if (_daysHistoric.Count % 7 == 0) { _weeksHistoric.Add(new CaptorsValue(GetAverage(_daysHistoric.TakeFromEnd(7)))); } if (_daysHistoric.Count % 31 == 0) { _monthsHistoric.Add(new CaptorsValue(GetAverage(_daysHistoric.TakeFromEnd(31)))); } } public void Clear() { _minutesHistoric.Clear(); _hoursHistoric.Clear(); _daysHistoric.Clear(); _weeksHistoric.Clear(); _monthsHistoric.Clear(); } private (double humidity, double luminosity, double temperature) GetAverage(IEnumerable captorsValues) { return ( captorsValues.Average(x => x.Humidity), captorsValues.Average(x => x.Luminosity), captorsValues.Average(x => x.Temperature) ); } } }