private void SetEnergyStoragesOnHouse([NotNull][ItemNotNull] List <CalcEnergyStorageDto> energyStorages,
                                              [NotNull] HouseholdKey householdKey,
                                              [NotNull] CalcHouse calchouse, CalcVariableRepository calcVariableRepository
                                              ) //, List<CalcDeviceTaggingSet> deviceTaggingSets)
        {
            var cess           = new List <CalcEnergyStorage>();
            var esCategoryGuid = Guid.NewGuid().ToStrGuid();
            var esLocGuid      = Guid.NewGuid().ToStrGuid();

            foreach (var es in energyStorages)
            {
                //foreach (DeviceTaggingSet set in deviceTaggingSets) {
                //set.AddTag(es.Name,"House Device");
                //}
                var           lti       = _ltDict.GetCalcLoadTypeByLoadtype(es.InputLoadType).ConvertToDto();
                CalcDeviceDto deviceDto = new CalcDeviceDto(es.Name, esCategoryGuid, householdKey, OefcDeviceType.Storage,
                                                            "Energy Storage", "", es.Guid, esLocGuid, "Energy Storages");
                var ces = new CalcEnergyStorage(_calcRepo.Odap,
                                                lti,
                                                es.MaximumStorageRate,
                                                es.MaximumWithdrawRate,
                                                es.MinimumStorageRate,
                                                es.MinimumWithdrawRate,
                                                es.InitialFill,
                                                es.StorageCapacity,
                                                _calcRepo.Logfile.EnergyStorageLogfile,
                                                deviceDto
                                                );
                foreach (var signal in es.Signals)
                {
                    CalcVariable cv     = calcVariableRepository.GetVariableByGuid(signal.CalcVariableDto.Guid);
                    var          cessig = new CalcEnergyStorageSignal(signal.Name,
                                                                      signal.TriggerOffPercent,
                                                                      signal.TriggerOnPercent,
                                                                      signal.Value,
                                                                      cv,
                                                                      signal.Guid);
                    ces.AddSignal(cessig);
                }

                cess.Add(ces);
                if (ces.Signals.Count != es.Signals.Count)
                {
                    throw  new LPGException("Signal not initialized correctly");
                }
            }

            var calcEnergyStorages = cess; //,deviceTaggingSets);

            calchouse.SetStorages(calcEnergyStorages);
            //return calcEnergyStorages;
        }
        public void ProcessOneEnergyStorageTimestepTest()
        {
            using (var wd = new WorkingDir(Utili.GetCurrentMethodAndClass()))
            {
                wd.InputDataLogger.AddSaver(new ColumnEntryLogger(wd.SqlResultLoggingService));
                wd.InputDataLogger.AddSaver(new ResultFileEntryLogger(wd.SqlResultLoggingService));
                wd.InputDataLogger.AddSaver(new HouseholdKeyLogger(wd.SqlResultLoggingService));
                CalcParameters calcParameters = CalcParametersFactory.MakeGoodDefaults();
                calcParameters.ShowSettlingPeriodTime = true;
                using (OnlineLoggingData old = new OnlineLoggingData(new DateStampCreator(calcParameters), wd.InputDataLogger, calcParameters))
                {
                    using (FileFactoryAndTracker fft = new FileFactoryAndTracker(wd.WorkingDirectory, "name", wd.InputDataLogger))
                    {
                        fft.RegisterGeneralHouse();
                        var           odap         = new OnlineDeviceActivationProcessor(old, calcParameters, fft);
                        var           clt          = new CalcLoadType("clt1", "W", "kWh", 1, true, Guid.NewGuid().ToStrGuid());
                        var           deviceGuid   = Guid.NewGuid().ToStrGuid();
                        HouseholdKey  hhkey        = new HouseholdKey("HH1");
                        var           locationGuid = Guid.NewGuid().ToStrGuid();
                        CalcDeviceDto cdd          = new CalcDeviceDto("dev1", "devcatguid".ToStrGuid(),
                                                                       hhkey, OefcDeviceType.Device, "devcatname", "", deviceGuid, locationGuid, "loc");
                        var key = new OefcKey(cdd, clt.Guid);
                        odap.RegisterDevice(clt.ConvertToDto(), cdd);
                        double[] timestepValue  = { 1.0, 0 };
                        var      timestepValues = new List <double>(timestepValue);
                        var      cp             = new CalcProfile("myCalcProfile", Guid.NewGuid().ToStrGuid(), timestepValues,
                                                                  ProfileType.Absolute, "synthetic");
                        CalcDeviceLoad cdl1 = new CalcDeviceLoad("", -10, clt, 0, 0);
                        var            rvp  = RandomValueProfile.MakeStepValues(cp.StepValues.Count, NormalRandom, 0);
                        StepValues     sv1  = StepValues.MakeStepValues(cp, 1, rvp, cdl1);
                        odap.AddNewStateMachine(new TimeStep(1, 0, true),
                                                clt.ConvertToDto(), "name1", "p1", key, cdd, sv1);
                        CalcDeviceLoad cdl2 = new CalcDeviceLoad("", -100, clt, 0, 0);
                        StepValues     sv2  = StepValues.MakeStepValues(cp, 1, rvp, cdl2);
                        odap.AddNewStateMachine(new TimeStep(3, 0, true),
                                                clt.ConvertToDto(), "name2", "syn", key, cdd, sv2);
                        CalcDeviceLoad cdl3 = new CalcDeviceLoad("", -10, clt, 0, 0);
                        StepValues     sv3  = StepValues.MakeStepValues(cp, 1, rvp, cdl3);
                        odap.AddNewStateMachine(new TimeStep(5, 0, true),
                                                clt.ConvertToDto(), "name3", "syn", key, cdd, sv3);
                        CalcDeviceLoad cdl4 = new CalcDeviceLoad("", 100, clt, 0, 0);
                        StepValues     sv4  = StepValues.MakeStepValues(cp, 1, rvp, cdl4);
                        odap.AddNewStateMachine(new TimeStep(7, 0, true),
                                                clt.ConvertToDto(), "name4", "syn", key, cdd, sv4);
                        double[] resultValues = { 0, -10.0, 0, -100, 0, 10, 0, 100, 0, 0 };
                        var      ces          = new CalcEnergyStorage(odap, clt.ConvertToDto(),
                                                                      100, 7, 0, 0, 5, 20, null,
                                                                      cdd);
                        List <OnlineEnergyFileRow> rawRows = new List <OnlineEnergyFileRow>();
                        int keyidx = 0;
                        foreach (var keys in odap.Oefc.ColumnEntriesByLoadTypeByDeviceKey.Values)
                        {
                            foreach (KeyValuePair <OefcKey, ColumnEntry> pair in keys)
                            {
                                Logger.Info("Key " + keyidx + " " + pair.Key.ToString() + " - " + pair.Value);
                                keyidx++;
                            }
                        }
                        for (var i = 0; i < 10; i++)
                        {
                            TimeStep ts       = new TimeStep(i, 0, true);
                            var      filerows = odap.ProcessOneTimestep(ts);
                            rawRows.Add(filerows[0]);
                            filerows.Count.Should().Be(1);
                            filerows[0].EnergyEntries.Count.Should().Be(1);
                            var sb = new StringBuilder("row0 before:");
                            sb.Append(filerows[0].EnergyEntries[0]);
                            sb.Append(" : ");
                            //sb.Append(filerows[0].EnergyEntries[1]);
                            //filerows[0].EnergyEntries[0].Should().Be(resultValues[i]);
                            for (var j = 0; j < 5; j++)
                            {
                                ces.ProcessOneTimestep(filerows, ts, null);
                            }

                            sb.Append(" row0 after:");
                            sb.Append(filerows[0].EnergyEntries[0]);
                            sb.Append(" : ");
                            //sb.Append(filerows[0].EnergyEntries[1]);
                            sb.Append(" :StorageLevel ");
                            sb.Append(ces.PreviousFillLevel);
                            sb.Append(" :Expected ");
                            sb.Append(resultValues[i]);
                            Logger.Info(sb.ToString());
                        }
                        rawRows.Count.Should().Be(10);
                    }
                }
                wd.CleanUp();
            }
        }