public void SaveWateringData(WateringData wateringData) { bool lockTaken = false; Monitor.TryEnter(_lock, new TimeSpan(0, 2, 0), ref lockTaken); if (!lockTaken) { _logger.Warning("SaveWateringData: Could not lock"); return; } using (var context = new WateringContext()) { context.Waterings.Add(wateringData); context.SaveChanges(); } Monitor.Exit(_lock); DateTime now = DateTime.Now; now = now.AddDays(-MaxHistoryDays); DeleteDataPointsFromDate(now); OnPropertyChanged(); }
private void MakeTestData() { WateringData data1 = new WateringData() { CorrHot = 1, CorrCold = 1, SamplesCount = 200, SamplesHot = 50, SamplesCold = 0, DurationRain = 0, Duration = 90, TimeStamp = DateTime.Now }; WateringData data2 = new WateringData() { CorrHot = 1, CorrCold = 1, SamplesCount = 200, SamplesHot = 40, SamplesCold = 0, DurationRain = 0, Duration = 60, TimeStamp = DateTime.Now.AddMinutes(15) }; WateringData data3 = new WateringData() { CorrHot = 1, CorrCold = 1, SamplesCount = 200, SamplesHot = 150, SamplesCold = 0, DurationRain = 0, Duration = 60, TimeStamp = DateTime.Now.AddMinutes(30) }; WateringData data4 = new WateringData() { CorrHot = 1, CorrCold = 1, SamplesCount = 200, SamplesHot = 150, SamplesCold = 0, DurationRain = 0, Duration = 60, TimeStamp = DateTime.Now.AddMinutes(45) }; WateringData data5 = new WateringData() { CorrHot = 1, CorrCold = 1, SamplesCount = 200, SamplesHot = 150, SamplesCold = 0, DurationRain = 0, Duration = 60, TimeStamp = DateTime.Now.AddMinutes(60) }; DataList = new RangeAddableObservableCollection <WateringData> { data1, data2, data3, data4, data5 }; }
private bool IsSecondWateringNecessary(DateTime?requDate) { bool forStatistics = requDate.HasValue; if (!_cfgCtrl.Configuration.SecondWateringActive && !forStatistics) { return(false); } var now = requDate ?? DateTime.Today; DateTime nowBeginAfternoon = now.Add(_cfgCtrl.Configuration.BeginAfternoonMonitoring); //now.Add(new TimeSpan(13, 0, 0)); DateTime nowEnd = now.Add(_cfgCtrl.Configuration.EndMonitoring); List <Measurement> samples = _wateringDataService.GetReadingPointsByStartAndEndTime(nowBeginAfternoon, nowEnd); int samplesCntAfternoon = samples.Count; int hotSamplesCnt = samples.Count(point => point.Temperature >= _cfgCtrl.Configuration.LevelHeatTemperature); double percentHot = samplesCntAfternoon > 0 ? (double)hotSamplesCnt / samplesCntAfternoon : 0d; percentHot *= 100d; if (forStatistics) { //"Leaving For Statistics".Warn(); return(percentHot >= _cfgCtrl.Configuration.PercentageHotFor2ndWateringActive); } if (percentHot < _cfgCtrl.Configuration.PercentageHotFor2ndWateringActive) { TimeToWatering2 = $"Kein 2. Gießen: {percentHot:F1}% über {_cfgCtrl.Configuration.LevelHeatTemperature:##}°"; _logger.Information("Kein 2. Gießen: {PercHot} % über {HotLevel}°. Start:{Start} Ende:{Ende}", percentHot.ToString("F1"), _cfgCtrl.Configuration.LevelHeatTemperature.ToString("##"), nowBeginAfternoon.ToString("d / M / yy hh: mm"), nowEnd.ToString("d / M / yy hh: mm")); OnPropertyChanged(nameof(TimeToWatering2)); return(false); } _logger.Information("2. Gießen: {PercHot} % über {HotLevel}°. Start:{Start} Ende:{Ende}", percentHot.ToString("F1"), _cfgCtrl.Configuration.LevelHeatTemperature.ToString("##"), nowBeginAfternoon.ToString("d / M / yy hh: mm"), nowEnd.ToString("d / M / yy hh: mm")); var traceData = new WateringData() { TimeStamp = DateTime.Now, CorrCold = 1, CorrHot = 1, SamplesCount = samplesCntAfternoon, SamplesHot = hotSamplesCnt, SamplesCold = 0, Duration = _cfgCtrl.Configuration.PumpDurationSecondCycle, }; _wateringDataService.SaveWateringData(traceData); return(true); }
private WateringCorrection CalcWateringDurationCorrection(DateTime?requDate) { bool statistics = requDate.HasValue; DateTime yesterdayBegin; DateTime yesterdayBeginAfternoon; DateTime yesterdayEnd; DateTime endForRain; bool emergencyWatering = _wateringDataService.EmergencyWateringNecessary(_cfgCtrl.Configuration.MaxDaysWithoutWatering); var now = requDate ?? DateTime.Today; if (statistics) { yesterdayBegin = now.Add(_cfgCtrl.Configuration.BeginMonitoring); yesterdayBeginAfternoon = now.Add(new TimeSpan(13, 0, 0)); yesterdayEnd = now.Add(_cfgCtrl.Configuration.EndMonitoring); endForRain = now.AddHours(23).AddMinutes(59).AddSeconds(59); } else { var yesterday = now.AddDays(-1); yesterdayBegin = yesterday.Add(_cfgCtrl.Configuration.BeginMonitoring); yesterdayBeginAfternoon = yesterday.Add(new TimeSpan(13, 0, 0)); yesterdayEnd = yesterday.Add(_cfgCtrl.Configuration.EndMonitoring); endForRain = DateTime.Now; } List <Measurement> samples = _wateringDataService.GetReadingPointsByStartAndEndTime(yesterdayBegin, yesterdayEnd); int samplesCnt = samples.Count; List <Measurement> samplesAfternoon = _wateringDataService.GetReadingPointsByStartAndEndTime(yesterdayBeginAfternoon, yesterdayEnd); List <Measurement> samplesForRain = _wateringDataService.GetReadingPointsByStartAndEndTime(endForRain.AddHours(-24), endForRain); int cntRain = samplesForRain.Count(p => p.Raining); int durationRain = cntRain * _cfgCtrl.Configuration.MeasurementFrequency; int stopDuration = _cfgCtrl.Configuration.RainDurationToStopWatering.Hours * 60 * 60 + _cfgCtrl.Configuration.RainDurationToStopWatering.Minutes * 60 + _cfgCtrl.Configuration.RainDurationToStopWatering.Seconds; bool stopWateringBecauseOfRain = durationRain >= stopDuration; if (stopWateringBecauseOfRain) { _logger.Information("Keine Bewässerung: {DurationRain} sec über {StopDuration} sec", durationRain, stopDuration); _logger.Information("Start: {StartRain} Ende: {EndRain}", endForRain.AddHours(-24).ToString("d / M / yy hh: mm"), endForRain.ToString("d / M / yy hh: mm")); if (emergencyWatering) { _logger.Warning("Not Bewässerung wird ausgeführt"); } } int hotSamplesCntAfternoon = samplesAfternoon.Count(point => point.Temperature >= _cfgCtrl.Configuration.LevelHeatTemperature); double tempAboveHotLevelAfternoon = 0d; foreach (Measurement sample in samplesAfternoon) { var diff = sample.Temperature - _cfgCtrl.Configuration.LevelHeatTemperature; if (diff > 0) { tempAboveHotLevelAfternoon += diff; } } //Eine Temperatur von 3° über dem Hitzelevel soll den CorrFactorHeat ergeben double maxSumForDeltaXDegrees = samplesAfternoon.Count * 3d; double corrHotNew = (tempAboveHotLevelAfternoon / maxSumForDeltaXDegrees) * _cfgCtrl.Configuration.CorrFactorHeat; if (hotSamplesCntAfternoon == 0) { corrHotNew = 1; } if (corrHotNew < 1d) { _logger.Warning("CorrHot korrigiert: Errechnter Wert: {CorrHotNew}", corrHotNew); corrHotNew = 1d; } if (corrHotNew * _cfgCtrl.Configuration.PumpDurationMainCycle > _cfgCtrl.Configuration.MaxPumpDurationMainCycle) { _logger.Warning("CorrHot korrigiert: Errechnter Wert {CorrHotNew} führt zu einer Gießzeit {PumpDuration} die oberhalb der maximalen Dauer {MaxDurMain} liegt", corrHotNew, corrHotNew * _cfgCtrl.Configuration.PumpDurationMainCycle, _cfgCtrl.Configuration.MaxPumpDurationMainCycle); corrHotNew = (double)_cfgCtrl.Configuration.MaxPumpDurationMainCycle / _cfgCtrl.Configuration.PumpDurationMainCycle; } int coldSamplesCntMonitoringHours = samples.Count(point => point.Temperature <= _cfgCtrl.Configuration.LevelColdTemperature); double tempBelowColdLevelMonitoringHours = samples.Select(sample => _cfgCtrl.Configuration.LevelColdTemperature - sample.Temperature).Where(diff => diff > 0).Sum(); maxSumForDeltaXDegrees = samplesCnt * 5d; double corrColdNew = (tempBelowColdLevelMonitoringHours / maxSumForDeltaXDegrees) * _cfgCtrl.Configuration.CorrFactorCold; if (coldSamplesCntMonitoringHours == 0) { corrColdNew = 1; } if (statistics) { return new WateringCorrection() { CorrFactorHot = stopWateringBecauseOfRain ? emergencyWatering ? 1 : 0 : corrHotNew, RainDuration = durationRain } } ; var wateringData = new WateringData() { TimeStamp = DateTime.Now, CorrCold = corrColdNew, CorrHot = corrHotNew, SamplesCount = samplesCnt, SamplesHot = hotSamplesCntAfternoon, SamplesCold = 0, Duration = stopWateringBecauseOfRain ? emergencyWatering ? 1 : 0 : _cfgCtrl.Configuration.PumpDurationMainCycle * corrHotNew, NoWateringBecauseRain = stopWateringBecauseOfRain, EmergencyWatering = emergencyWatering, PercentageHot = samplesAfternoon.Count > 0 ? (double)hotSamplesCntAfternoon / samplesAfternoon.Count * 100d : 0d, PercentageCold = (double)coldSamplesCntMonitoringHours / samplesCnt * 100d, DurationRain = durationRain }; _wateringDataService.SaveWateringData(wateringData); return(new WateringCorrection() { CorrFactorHot = stopWateringBecauseOfRain ? (emergencyWatering ? 1 : 0) : corrHotNew, CorrFactorCold = stopWateringBecauseOfRain ? (emergencyWatering ? 1 : 0) : corrColdNew, RainDuration = durationRain }); }