Exemplo n.º 1
0
        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();
        }
Exemplo n.º 2
0
        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
            });
        }