diff --git a/Zero_engine.alpx b/Zero_engine.alpx index b5e55d46..cb073a63 100644 --- a/Zero_engine.alpx +++ b/Zero_engine.alpx @@ -963,44 +963,36 @@ 1668693527446 - - @@ -1281,7 +1273,44 @@ - + + + 1752677823817 + + + + 1752677826356 + + + + 1752677829820 + + + + 1752677832758 + + + + 1752679379816 + + + + 1752680962144 + + + + 1752681631114 + + + + 1752681639768 + + + + 1752737189062 + + + EULER RK45_NEWTON @@ -1357,120 +1386,148 @@ 1659091451342 + 1752677832758 1659091479591 + 1752677832758 1659091488030 + 1752677832758 1659104834899 + 1752677832758 1659108919926 + 1752677832758 1659117174456 + 1752677832758 1659117174457 true + 1752677832758 1659117174458 + 1752677832758 1659446215929 + 1752677832758 1659446215929 + 1752677832758 1659447107390 + 1752677832758 1659447107391 + 1752677832758 1659513814164 + 1752677832758 1659534704067 + 1752677832758 1660131551684 + 1752677832758 1661266990567 true + 1752737189062 1661349111073 true + 1752737189062 1663238817163 + 1752680962144 1665502017804 + 1752677832758 1666189454452 + 1752677832758 1666189454453 true + 1752677832758 1666879973864 true + 1752737189062 1666879973865 true + 1752737189062 1668600448637 + 1752677832758 1671107396262 + 1752677832758 1671522756085 + 1752677832758 1673445448881 + 1752677832758 1673445438882 + 1752680962144 1673445448882 @@ -1487,47 +1544,58 @@ 1673445448885 + 1752680962144 1678469210821 true + 1752677832758 1692861398767 + 1752681639768 1692862190945 + 1752681639768 1692862773194 + 1752677832758 1692876125447 + 1752681639768 1707991094535 + 1752677832758 1707992650964 + 1752677832758 1711009967838 + 1752677832758 1715862850276 + 1752680962144 1726148464063 + 1752680962144 1727774738469 @@ -1541,23 +1609,28 @@ 1729171686537 true + 1752737189062 1729262288167 + 1752679379816 1729510354900 + 1752679379816 1729586334721 true + 1752737189062 1731483284975 + 1752679379816 1737025326025 @@ -1566,14 +1639,17 @@ 1737633433233 + 1752677832758 1740048926477 + 1752679379816 1740048926478 + 1752679379816 1741163937278 @@ -1582,26 +1658,27 @@ 1741180550081 + 1752680962144 1741180880935 + 1752680962144 1741361867834 + 1752680962144 1741864496371 - - - 1746606645736 - + 1752680962144 1749648342034 + 1752677832758 1749649002419 @@ -1610,6 +1687,37 @@ 1749651263461 + 1752677832758 + + + 1752677257516 + + 1752677826356 + + + 1752677992581 + + 1752677826356 + + + 1752678003039 + + 1752677826356 + + + 1752678015847 + + 1752677826356 + + + 1752678031327 + + 1752677826356 + + + 1753169766770 + + 1752677826356 diff --git a/_alp/Agents/A_SubTenant/AOC.A_SubTenant.xml b/_alp/Agents/A_SubTenant/AOC.A_SubTenant.xml index b0569e05..42791de0 100644 --- a/_alp/Agents/A_SubTenant/AOC.A_SubTenant.xml +++ b/_alp/Agents/A_SubTenant/AOC.A_SubTenant.xml @@ -2,6 +2,8 @@ 1658752695711 + true + 1752737189062 zero_engine Actor diff --git a/_alp/Agents/Actor/AOC.Actor.xml b/_alp/Agents/Actor/AOC.Actor.xml index 25914454..91fd085a 100644 --- a/_alp/Agents/Actor/AOC.Actor.xml +++ b/_alp/Agents/Actor/AOC.Actor.xml @@ -2,6 +2,7 @@ 1674662535386 + 1752677829820 false 1674662535384 diff --git a/_alp/Agents/ConnectionOwner/AOC.ConnectionOwner.xml b/_alp/Agents/ConnectionOwner/AOC.ConnectionOwner.xml index c7c40b96..352501dd 100644 --- a/_alp/Agents/ConnectionOwner/AOC.ConnectionOwner.xml +++ b/_alp/Agents/ConnectionOwner/AOC.ConnectionOwner.xml @@ -2,6 +2,7 @@ 1660224852394 + 1752677829820 zero_engine diff --git a/_alp/Agents/ConnectionOwner/Variables.xml b/_alp/Agents/ConnectionOwner/Variables.xml index 95dec139..31721350 100644 --- a/_alp/Agents/ConnectionOwner/Variables.xml +++ b/_alp/Agents/ConnectionOwner/Variables.xml @@ -1651,6 +1651,7 @@ 1704196760553 + true 60 440 - - 1746606592165 - - 1160 - 800 - - false - true - true - - - - - - - 1732029220158 diff --git a/_alp/Agents/GCHouse/AOC.GCHouse.xml b/_alp/Agents/GCHouse/AOC.GCHouse.xml index 1fac8e85..5834fb49 100644 --- a/_alp/Agents/GCHouse/AOC.GCHouse.xml +++ b/_alp/Agents/GCHouse/AOC.GCHouse.xml @@ -3,6 +3,7 @@ 1663772408667 + 1752677823817 zero_engine GridConnection @@ -38,9 +39,6 @@ - - - @@ -104,6 +102,9 @@ + + + false diff --git a/_alp/Agents/GCHouse/Code/AdditionalClassCode.java b/_alp/Agents/GCHouse/Code/AdditionalClassCode.java index 5667ec32..e6c07d58 100644 --- a/_alp/Agents/GCHouse/Code/AdditionalClassCode.java +++ b/_alp/Agents/GCHouse/Code/AdditionalClassCode.java @@ -35,11 +35,6 @@ public void f_chargeOnPrice(double a, double b){ f_chargeOnPrice_overwrite(a,b); }*/ -@Override -public void f_batteryManagementPrice(double currentBatteryStateOfCharge) { - f_batteryManagementPrice_overwrite(currentBatteryStateOfCharge); -} - @Override public void f_simpleCharging(){ f_simpleCharging_overwrite(); diff --git a/_alp/Agents/GCHouse/Code/Functions.java b/_alp/Agents/GCHouse/Code/Functions.java index b5acecf4..8c4a9ed8 100644 --- a/_alp/Agents/GCHouse/Code/Functions.java +++ b/_alp/Agents/GCHouse/Code/Functions.java @@ -94,28 +94,7 @@ */ f_manageChargers(); - -v_currentLoadLowPassed_kW += v_lowPassFactorLoad_fr * ( fm_currentBalanceFlows_kW.get(OL_EnergyCarriers.ELECTRICITY) - v_currentLoadLowPassed_kW ); - -if ( p_batteryAsset != null ) { - if ( p_batteryAsset.getStorageCapacity_kWh() != 0.0) { - v_batterySOC_fr = p_batteryAsset.getCurrentStateOfCharge(); - if( p_batteryOperationMode == OL_BatteryOperationMode.HOUSEHOLD_LOAD){ - f_batteryManagementBalance(v_batterySOC_fr); -// } else if (p_batteryOperationMode == OL_BatteryOperationMode.BALANCE_SUPPLY){ // Tries to minimize supply peaks -// f_batteryManagementBalanceSupply(v_batterySOC_fr); - } else if (p_batteryOperationMode == OL_BatteryOperationMode.PRICE){ - f_batteryManagementPrice(v_batterySOC_fr); - } else if (p_batteryOperationMode == OL_BatteryOperationMode.NODAL_PRICING){ - f_batteryManagementNodalPricing(v_batterySOC_fr); - } else if (p_batteryOperationMode == OL_BatteryOperationMode.SELF_CONSUMPTION){ - f_batteryManagementSelfConsumption(); - } - p_batteryAsset.f_updateAllFlows(p_batteryAsset.v_powerFraction_fr); - v_batterySOC_fr = p_batteryAsset.getCurrentStateOfCharge(); - } -} - +f_manageBattery(); /*ALCODEEND*/} double f_connectToChild_overwrite(Agent ConnectingParentNode) @@ -455,7 +434,7 @@ else if (lastLoopsPriceLevel.equals("low") && powerAvailableAtLastLoop_kW > p_mi double availableCapacityFromBatteries = p_batteryAsset == null ? 0 : p_batteryAsset.getCapacityAvailable_kW(); //double availableChargingCapacity = v_allowedCapacity_kW + availableCapacityFromBatteries - v_currentPowerElectricity_kW; double availableChargingCapacity = v_liveConnectionMetaData.contractedDeliveryCapacity_kW + availableCapacityFromBatteries - fm_currentBalanceFlows_kW.get(OL_EnergyCarriers.ELECTRICITY); -v_vehicleSOC_fr = p_householdEV.getCurrentStateOfCharge(); +v_vehicleSOC_fr = p_householdEV.getCurrentStateOfCharge_fr(); switch (p_chargingAttitudeVehicles) { case SIMPLE: @@ -479,7 +458,7 @@ else if (lastLoopsPriceLevel.equals("low") && powerAvailableAtLastLoop_kW > p_mi {/*ALCODESTART::1675033218897*/ double powerFraction_fr = 0; -if( p_householdEV.getCurrentStateOfCharge() < 1 ) { +if( p_householdEV.getCurrentStateOfCharge_fr() < 1 ) { powerFraction_fr = 1; /*if ( p_hasSmartFlexAssets ){ ConnectionOwner owner = ((ConnectionOwner)l_ownerActor.getConnectedAgent()); @@ -739,70 +718,6 @@ else if ( v_batterySOC_fr < 0.6 && v_currentPowerElectricity_kW < 1 && v_current /*ALCODEEND*/} -double f_batteryManagementPrice_overwrite(double currentBatteryStateOfCharge) -{/*ALCODESTART::1678709047802*/ -if (p_batteryAsset.getStorageCapacity_kWh() != 0){ - //double willingnessToPayDefault_eurpkWh = 0.3; - double chargeDischarge_offset_eurpkWh = 0.0; - double WTPfeedbackGain_eurpSOC = 0.25; // When SOC-error is 100%, adjust WTP price by 1 eurpkWh - double priceGain = 2; // How strongly to ramp up power with price-delta's - //double congestionTariffCoop_eurpkWh = -(((ConnectionOwner)p_ownerActor).p_CoopParent.v_electricitySurplus_kW + v_previousPowerElectricity_kW)/1200*0.1; - - double chargeSetpoint_kW = 0; - - if(p_owner != null) { - //traceln("Initial Mappings are: " + ((ConnectionOwner)p_ownerActor).v_currentPriceBands); - double currentElectricityPriceCharge_eurpkWh = p_owner.f_getElectricityPrice(fm_currentBalanceFlows_kW.get(OL_EnergyCarriers.ELECTRICITY) + 10.0); // query price at 100kW charging - double currentElectricityPriceDischarge_eurpkWh = p_owner.f_getElectricityPrice(fm_currentBalanceFlows_kW.get(OL_EnergyCarriers.ELECTRICITY) - 10.0); // query price at -100kW charging - //double lowPassFraction = min(1,1*1.2*energyModel.p_timeStep_h); // smaller value results in more filtering - //v_electricityPriceLowPassed_eurpkWh += v_lowPassFactor_fr * ( currentElectricityPriceCharge_eurpkWh - v_electricityPriceLowPassed_eurpkWh ); - - //double currentPricePowerBandPos_kW = ownerActor.v_priceBandsDelivery.ceilingKey(10.0); // Up to what power does this price hold? - //double currentPricePowerBandNeg_kW = ownerActor.v_priceBandsDelivery.floorKey(10.0); // Down to what power does this price hold? - - double SOC_setp_fr = 0.5; - //traceln("Current price is " + currentElectricityPriceCharge_eurpkWh + " eurpkWh, between " + currentPricePowerBandNeg_kW + " kW and " + currentPricePowerBandPos_kW + " kW"); - if (!c_vehicleAssets.isEmpty()) { - SOC_setp_fr = 0.5 + 0.25 * Math.sin(2*Math.PI*(energyModel.t_h-12)/24); // Sinusoidal setpoint: aim for low SOC at 6:00h, high SOC at 18:00h. - } else if (energyModel.v_liveAssetsMetaData.totalInstalledWindPower_kW > 0 ) { - SOC_setp_fr = 0.9 - 0.8 * energyModel.v_WindYieldForecast_fr; - //traceln("Forecast-based SOC setpoint: " + SOC_setp_fr + " %"); - } - double SOC_deficit_fr = SOC_setp_fr - currentBatteryStateOfCharge; // How far away from desired SOC? SOC too LOW is a POSITIVE deficit - - // Define WTP price for charging and discharging! - double WTP_charge_eurpkWh = v_electricityPriceLowPassed_eurpkWh - chargeDischarge_offset_eurpkWh + SOC_deficit_fr * WTPfeedbackGain_eurpSOC; - double WTP_discharge_eurpkWh = v_electricityPriceLowPassed_eurpkWh + chargeDischarge_offset_eurpkWh + SOC_deficit_fr * WTPfeedbackGain_eurpSOC; - - //traceln("WTP charge is " + WTP_charge_eurpkWh + " eurpkWh, discharge is " + WTP_discharge_eurpkWh + " eurpkWh"); - // Choose charging power based on prices and desired SOC level - if ( WTP_charge_eurpkWh > currentElectricityPriceCharge_eurpkWh ) { // if willingness to pay higher than current electricity price - //chargeSetpoint_kW = min(p_batteryAsset.getElectricCapacity_kW()*(WTP_charge_eurpkWh - currentElectricityPriceCharge_eurpkWh)*priceGain, currentPricePowerBandPos_kW) ; - chargeSetpoint_kW = p_batteryAsset.getCapacityElectric_kW()*(WTP_charge_eurpkWh - currentElectricityPriceCharge_eurpkWh)*priceGain; - //traceln("WTP charge " + WTP_charge_eurpkWh + " eurpkWh is high than electricity price " + currentElectricityPriceCharge_eurpkWh + " eurpkWh, so charge!") ; - } else if (WTP_discharge_eurpkWh < currentElectricityPriceDischarge_eurpkWh) { - //chargeSetpoint_kW = -min(p_batteryAsset.getElectricCapacity_kW()*(currentElectricityPriceDischarge_eurpkWh - WTP_discharge_eurpkWh)*priceGain, currentPricePowerBandPos_kW); - chargeSetpoint_kW = -p_batteryAsset.getCapacityElectric_kW()*(currentElectricityPriceDischarge_eurpkWh - WTP_discharge_eurpkWh)*priceGain; - //traceln("WTP discharge " + WTP_discharge_eurpkWh + " eurpkWh is lower than electricity price " + currentElectricityPriceCharge_eurpkWh + " eurpkWh, so discharge!") ; - } - - // limit charging power to available connection capacity - boolean b_stayWithinConnectionLimits = true; - if( b_stayWithinConnectionLimits ) { - - double electricitySurplus_kW = - fm_currentBalanceFlows_kW.get(OL_EnergyCarriers.ELECTRICITY); - - double availableChargePower_kW = electricitySurplus_kW + v_liveConnectionMetaData.contractedDeliveryCapacity_kW; // Max battery charging power within grid capacity - double availableDischargePower_kW = electricitySurplus_kW - v_liveConnectionMetaData.contractedFeedinCapacity_kW; // Max discharging power within grid capacity - chargeSetpoint_kW = min(max(chargeSetpoint_kW, availableDischargePower_kW),availableChargePower_kW); // Don't allow too much (dis)charging! - } - - p_batteryAsset.v_powerFraction_fr = max(-1,min(1, chargeSetpoint_kW / p_batteryAsset.getCapacityElectric_kW())); // Convert to powerFraction and limit power - } - p_batteryAsset.f_updateAllFlows( p_batteryAsset.v_powerFraction_fr ); -} -/*ALCODEEND*/} - double f_connectTo_J_EA_House(J_EA j_ea) {/*ALCODESTART::1693300820997*/ if (j_ea instanceof J_EAConversion) { diff --git a/_alp/Agents/GCHouse/Code/Functions.xml b/_alp/Agents/GCHouse/Code/Functions.xml index c04bd689..dd5b575a 100644 --- a/_alp/Agents/GCHouse/Code/Functions.xml +++ b/_alp/Agents/GCHouse/Code/Functions.xml @@ -215,26 +215,6 @@ true - - VOID - double - 1678709047802 - - 920 - 300 - - false - true - true - - - - - - VOID double diff --git a/_alp/Agents/GCHouse/Levels/Level.level.xml b/_alp/Agents/GCHouse/Levels/Level.level.xml index 8e8b7b48..4c2bbbb9 100644 --- a/_alp/Agents/GCHouse/Levels/Level.level.xml +++ b/_alp/Agents/GCHouse/Levels/Level.level.xml @@ -105,7 +105,7 @@ 1726301549553 - + 1560 30 - - VOID - double - 1730897215443 - - 920 - 280 - - false - false - true - - - - - - - - VOID - double - 1730897215446 - - 920 - 300 - - false - true - true - - - - - - VOID double @@ -259,10 +219,6 @@ false false true - - - - diff --git a/_alp/Agents/GCNeighborhood/Variables.xml b/_alp/Agents/GCNeighborhood/Variables.xml index f6af3944..7ef3c6a3 100644 --- a/_alp/Agents/GCNeighborhood/Variables.xml +++ b/_alp/Agents/GCNeighborhood/Variables.xml @@ -494,6 +494,25 @@ + + 1752589060012 + + 1270 + 450 + + false + true + true + + + + 1722588367044 diff --git a/_alp/Agents/GCPublicCharger/AOC.GCPublicCharger.xml b/_alp/Agents/GCPublicCharger/AOC.GCPublicCharger.xml index 4c7a973d..e8a6dff0 100644 --- a/_alp/Agents/GCPublicCharger/AOC.GCPublicCharger.xml +++ b/_alp/Agents/GCPublicCharger/AOC.GCPublicCharger.xml @@ -3,6 +3,7 @@ 1717956409506 + 1752677823817 zero_engine GridConnection @@ -41,9 +42,6 @@ - - - @@ -104,6 +102,9 @@ + + + false diff --git a/_alp/Agents/GCUtility/AOC.GCUtility.xml b/_alp/Agents/GCUtility/AOC.GCUtility.xml index e5839dff..2700594e 100644 --- a/_alp/Agents/GCUtility/AOC.GCUtility.xml +++ b/_alp/Agents/GCUtility/AOC.GCUtility.xml @@ -3,6 +3,7 @@ 1672138285227 + 1752677823817 zero_engine GridConnection @@ -41,9 +42,6 @@ - - - @@ -104,6 +102,9 @@ + + + false diff --git a/_alp/Agents/GCUtility/Code/Functions.java b/_alp/Agents/GCUtility/Code/Functions.java index a5adc7b0..696ed1cd 100644 --- a/_alp/Agents/GCUtility/Code/Functions.java +++ b/_alp/Agents/GCUtility/Code/Functions.java @@ -1,65 +1,14 @@ double f_operateFlexAssets_overwrite() {/*ALCODESTART::1698936515692*/ f_manageHeatingAssets(); -/*for ( J_EAStorage e : c_storageAssets ) { - v_currentPowerHeat_kW += e.heatConsumption_kW - e.heatProduction_kW; //peter 13-3-23: ik snap niet waarom dit hier staat. dit komt in de knoop met andere storage assets (zoals batterij) -}*/ f_manageCharging(); -if (p_batteryAsset != null){ // TEST CODE - if (p_batteryAsset.getStorageCapacity_kWh() > 0 && p_batteryAsset.getCapacityElectric_kW() > 0) { - - switch (p_batteryOperationMode) { - case BALANCE: - f_batteryManagementBalance(p_batteryAsset.getCurrentStateOfCharge()); - break; - case SELF_CONSUMPTION: - f_batteryManagementSelfConsumption(); - break; - case PRICE: - f_batteryManagementPrice(p_batteryAsset.getCurrentStateOfCharge()); - break; - case NODAL_PRICING: - f_batteryManagementNodalPricing(p_batteryAsset.getCurrentStateOfCharge()); - break; - case PEAK_SHAVING_SIMPLE: - f_batteryManagementPeakShaving(); - break; - } - - p_batteryAsset.f_updateAllFlows(p_batteryAsset.v_powerFraction_fr); - v_batterySOC_fr = p_batteryAsset.getCurrentStateOfCharge(); - //traceln("flows:" + Arrays.toString(arr)); - //v_batteryPowerElectric_kW = arr[4] - arr[0]; - } -} -/*for( J_EAVehicle v: c_vehicleAssets) { - v_currentPowerElectricity_kW += v.electricityConsumption_kW - v.electricityProduction_kW; -}*/ - -//v_currentLoadLowPassed_kW += v_lowPassFactorLoad_fr * ( v_currentPowerElectricity_kW - v_currentLoadLowPassed_kW ); //you want to do deterine the lowpassLoad BEFORE the using the battery. As this behavior of the battery should nog be dependent on the load of the battery in the previous timesteps +f_manageBattery(); if (v_enableFuelCell) { f_manageFuelCell(); } - -/*if( p_batteryAsset != null){ - switch (p_batteryOperationMode){ - case HOUSEHOLD_LOAD: - f_batteryManagementBalance(v_batterySOC_fr); - break; - case PRICE: - f_batteryManagementPrice_overwrite(v_batterySOC_fr); - break; - default: - break; - } - v_batteryPowerElectric_kW = p_batteryAsset.electricityConsumption_kW - p_batteryAsset.electricityProduction_kW; - v_currentPowerElectricity_kW +=v_batteryPowerElectric_kW; - v_batterySOC_fr = p_batteryAsset.getCurrentStateOfCharge(); -}*/ - /*ALCODEEND*/} double f_manageFuelCell() diff --git a/_alp/Agents/GIS_Building/AOC.GIS_Building.xml b/_alp/Agents/GIS_Building/AOC.GIS_Building.xml index 6cdb4471..c4d56b06 100644 --- a/_alp/Agents/GIS_Building/AOC.GIS_Building.xml +++ b/_alp/Agents/GIS_Building/AOC.GIS_Building.xml @@ -3,6 +3,7 @@ 1676382560905 + 1752681631114 zero_engine GIS_Object diff --git a/_alp/Agents/GIS_Object/AOC.GIS_Object.xml b/_alp/Agents/GIS_Object/AOC.GIS_Object.xml index 8094eee7..42e32d4e 100644 --- a/_alp/Agents/GIS_Object/AOC.GIS_Object.xml +++ b/_alp/Agents/GIS_Object/AOC.GIS_Object.xml @@ -3,6 +3,7 @@ 1667726338857 + 1752681631114 false 1667726338855 diff --git a/_alp/Agents/GIS_Parcel/AOC.GIS_Parcel.xml b/_alp/Agents/GIS_Parcel/AOC.GIS_Parcel.xml index 056172c3..8cc26408 100644 --- a/_alp/Agents/GIS_Parcel/AOC.GIS_Parcel.xml +++ b/_alp/Agents/GIS_Parcel/AOC.GIS_Parcel.xml @@ -3,6 +3,7 @@ 1660572036696 + 1752681631114 zero_engine GIS_Object diff --git a/_alp/Agents/GovernmentLayer/AOC.GovernmentLayer.xml b/_alp/Agents/GovernmentLayer/AOC.GovernmentLayer.xml index 5ec4ff74..0aa4350d 100644 --- a/_alp/Agents/GovernmentLayer/AOC.GovernmentLayer.xml +++ b/_alp/Agents/GovernmentLayer/AOC.GovernmentLayer.xml @@ -2,6 +2,7 @@ 1660731364525 + 1752677829820 zero_engine Actor diff --git a/_alp/Agents/GridConnection/AOC.GridConnection.xml b/_alp/Agents/GridConnection/AOC.GridConnection.xml index 4a7f4a2d..195ea4e3 100644 --- a/_alp/Agents/GridConnection/AOC.GridConnection.xml +++ b/_alp/Agents/GridConnection/AOC.GridConnection.xml @@ -3,6 +3,7 @@ 1658499438203 + 1752677823817 0 ) { // Look at weather forecast to charge/discharge battery - SOC_setp_fr = 0.9 - 0.8 * energyModel.v_WindYieldForecast_fr; - //traceln("Forecast-based SOC setpoint: " + SOC_setp_fr + " %"); - } - //traceln("SOC setpoint at " + energyModel.t_hourOfDay + " h is " + SOC_setp_fr*100 + "%"); - double FeedbackGain_kWpSOC = 1.5 * p_batteryAsset.getCapacityElectric_kW(); // How strongly to aim for SOC setpoint - double FeedforwardGain_kWpKw = 0.8; // Feedforward based on current surpluss in Coop - double chargeOffset_kW = 0; // Charging 'bias', basically increases SOC setpoint slightly during the whole day. - double chargeSetpoint_kW = 0; - chargeSetpoint_kW = FeedforwardGain_kWpKw * (electricitySurplus_kW + chargeOffset_kW) + (SOC_setp_fr - batterySOC) * FeedbackGain_kWpSOC; - chargeSetpoint_kW = min(max(chargeSetpoint_kW, availableDischargePower_kW),availableChargePower_kW); // Don't allow too much (dis)charging! - p_batteryAsset.v_powerFraction_fr = max(-1,min(1, chargeSetpoint_kW / p_batteryAsset.getCapacityElectric_kW())); // Convert to powerFraction and limit power - //traceln("Coop surpluss " + currentCoopElectricitySurplus_kW + "kW, Battery charging power " + p_batteryAsset.v_powerFraction_fr*p_batteryAsset.j_ea.getElectricCapacity_kW() + " kW at " + currentBatteryStateOfCharge*100 + " % SOC"); -} -/*ALCODEEND*/} - -double f_batteryManagementPrice(double currentBatteryStateOfCharge) -{/*ALCODESTART::1669022552780*/ -if (p_batteryAsset.getStorageCapacity_kWh() != 0){ - //double willingnessToPayDefault_eurpkWh = 0.3; - double chargeDischarge_offset_eurpkWh = 0.0; - double WTPfeedbackGain_eurpSOC = 0.5; // When SOC-error is 100%, adjust WTP price by 1 eurpkWh - double priceGain_kWhpeur = 2; // How strongly to ramp up power with price-delta's - //double congestionTariffCoop_eurpkWh = -(((ConnectionOwner)p_ownerActor).p_CoopParent.v_electricitySurplus_kW + v_previousPowerElectricity_kW)/1200*0.1; - - double chargeSetpoint_kW = 0; - - if( p_owner != null) { - //traceln("Initial Mappings are: " + ((ConnectionOwner)p_ownerActor).v_currentPriceBands); - double currentElectricityPriceCharge_eurpkWh = p_owner.f_getElectricityPrice(fm_currentBalanceFlows_kW.get(OL_EnergyCarriers.ELECTRICITY)+100.0); // query price at 100kW charging - double currentElectricityPriceDischarge_eurpkWh = p_owner.f_getElectricityPrice(fm_currentBalanceFlows_kW.get(OL_EnergyCarriers.ELECTRICITY)-100.0); // query price at -100kW charging - //double lowPassFraction = min(1,1*1.2*energyModel.p_timeStep_h); // smaller value results in more filtering - v_electricityPriceLowPassed_eurpkWh += v_lowPassFactor_fr * ( currentElectricityPriceCharge_eurpkWh - v_electricityPriceLowPassed_eurpkWh ); - - //double currentPricePowerBandPos_kW = ownerActor.v_priceBandsDelivery.ceilingKey(100.0); // Up to what power does this price hold? - //double currentPricePowerBandNeg_kW = ownerActor.v_priceBandsDelivery.floorKey(100.0); // Down to what power does this price hold? - - double SOC_setp_fr = 0.5; - //traceln("Current price is " + currentElectricityPriceCharge_eurpkWh + " eurpkWh, between " + currentPricePowerBandNeg_kW + " kW and " + currentPricePowerBandPos_kW + " kW"); - if (!c_vehicleAssets.isEmpty()) { - SOC_setp_fr = 0.5 + 0.25 * Math.sin(2*Math.PI*(energyModel.t_h-12)/24); // Sinusoidal setpoint: aim for low SOC at 6:00h, high SOC at 18:00h. - } else if (energyModel.v_liveAssetsMetaData.totalInstalledWindPower_kW > 0 ) { - SOC_setp_fr = 0.9 - 0.8 * energyModel.v_WindYieldForecast_fr; - //traceln("Forecast-based SOC setpoint: " + SOC_setp_fr + " %"); - } - double SOC_deficit_fr = SOC_setp_fr - currentBatteryStateOfCharge; // How far away from desired SOC? SOC too LOW is a POSITIVE deficit - - // Define WTP price for charging and discharging! - double WTP_charge_eurpkWh = v_electricityPriceLowPassed_eurpkWh - chargeDischarge_offset_eurpkWh + SOC_deficit_fr * WTPfeedbackGain_eurpSOC; - double WTP_discharge_eurpkWh = v_electricityPriceLowPassed_eurpkWh + chargeDischarge_offset_eurpkWh + SOC_deficit_fr * WTPfeedbackGain_eurpSOC; - - //traceln("WTP charge is " + WTP_charge_eurpkWh + " eurpkWh, discharge is " + WTP_discharge_eurpkWh + " eurpkWh"); - // Choose charging power based on prices and desired SOC level - if ( WTP_charge_eurpkWh > currentElectricityPriceCharge_eurpkWh ) { // if willingness to pay higher than current electricity price - //chargeSetpoint_kW = min(p_batteryAsset.getElectricCapacity_kW()*(WTP_charge_eurpkWh - currentElectricityPriceCharge_eurpkWh)*priceGain, currentPricePowerBandPos_kW) ; - chargeSetpoint_kW = p_batteryAsset.getCapacityElectric_kW()*(WTP_charge_eurpkWh - currentElectricityPriceCharge_eurpkWh)*priceGain_kWhpeur; - //traceln("WTP charge " + WTP_charge_eurpkWh + " eurpkWh is high than electricity price " + currentElectricityPriceCharge_eurpkWh + " eurpkWh, so charge!") ; - } else if (WTP_discharge_eurpkWh < currentElectricityPriceDischarge_eurpkWh) { - //chargeSetpoint_kW = -min(p_batteryAsset.getElectricCapacity_kW()*(currentElectricityPriceDischarge_eurpkWh - WTP_discharge_eurpkWh)*priceGain, currentPricePowerBandPos_kW); - chargeSetpoint_kW = -p_batteryAsset.getCapacityElectric_kW()*(currentElectricityPriceDischarge_eurpkWh - WTP_discharge_eurpkWh)*priceGain_kWhpeur; - //traceln("WTP discharge " + WTP_discharge_eurpkWh + " eurpkWh is lower than electricity price " + currentElectricityPriceCharge_eurpkWh + " eurpkWh, so discharge!") ; - } - - // limit charging power to available connection capacity - boolean b_stayWithinConnectionLimits = true; - if( b_stayWithinConnectionLimits ) { - double electricitySurplus_kW = - fm_currentBalanceFlows_kW.get(OL_EnergyCarriers.ELECTRICITY); - - double availableChargePower_kW = electricitySurplus_kW + v_liveConnectionMetaData.contractedDeliveryCapacity_kW; // Max battery charging power within grid capacity - double availableDischargePower_kW = electricitySurplus_kW - v_liveConnectionMetaData.contractedFeedinCapacity_kW; // Max discharging power within grid capacity - chargeSetpoint_kW = min(max(chargeSetpoint_kW, availableDischargePower_kW),availableChargePower_kW); // Don't allow too much (dis)charging! - } - - p_batteryAsset.v_powerFraction_fr = max(-1,min(1, chargeSetpoint_kW / p_batteryAsset.getCapacityElectric_kW())); // Convert to powerFraction and limit power - } -} - -/*ALCODEEND*/} - double f_manageHeatingAssets() {/*ALCODESTART::1669025846794*/ // TODO: This only works for fixed heat demands; also need to implement heating of a building modeled as a ThermalStorageAsset! [GH 21/11/2022] @@ -359,7 +261,7 @@ else if (p_primaryHeatingAsset== null && p_secondaryHeatingAsset != null && v_ha for ( int i = 0; i < copiedVehicleList.size(); i++ ) { J_EAEV ev = copiedVehicleList.get(i); if (ev.vehicleScaling != 0) { - if( !ev.getAvailability() || ev.getCurrentStateOfCharge() == 1 ) { + if( !ev.getAvailability() || ev.getCurrentStateOfCharge_fr() == 1 ) { ev.f_updateAllFlows( 0.0 ); c_vehiclesAvailableForCharging.remove( i - countDeletedItems ); countDeletedItems ++; @@ -379,17 +281,17 @@ else if (p_primaryHeatingAsset== null && p_secondaryHeatingAsset != null && v_ha for ( int i = 0; i < copiedVehicleList.size(); i++ ){ J_EAEV ev = copiedVehicleList.get(i); if (ev.vehicleScaling != 0) { - if(!ev.getAvailability() || ev.getCurrentStateOfCharge() == 1) { + if(!ev.getAvailability() || ev.getCurrentStateOfCharge_fr() == 1) { ev.f_updateAllFlows( 0.0 ); c_vehiclesAvailableForCharging.remove( i - countDeletedItems ); countDeletedItems ++; } else { - double chargeNeedForNextTrip_kWh = max(0, ev.getEnergyNeedForNextTrip_kWh() - ev.getStorageCapacity_kWh()*ev.getCurrentStateOfCharge()); + double chargeNeedForNextTrip_kWh = max(0, ev.getEnergyNeedForNextTrip_kWh() - ev.getCurrentStateOfCharge_kWh()); double maxChargingPower_kW = ev.getCapacityElectric_kW(); double chargeDeadline_h = floor((ev.tripTracker.v_nextEventStartTime_min / 60 - chargeNeedForNextTrip_kWh / maxChargingPower_kW) / energyModel.p_timeStep_h) * energyModel.p_timeStep_h; - double emptyKWhInBattery = ev.getStorageCapacity_kWh() * (1 - ev.getCurrentStateOfCharge()); + double emptyKWhInBattery = ev.getStorageCapacity_kWh() - ev.getCurrentStateOfCharge_kWh(); double timeToNextTrip_h = ev.tripTracker.v_nextEventStartTime_min / 60 - energyModel.t_h; // At the end of the simulation the triptracker returns back to the start of the year, so we make sure the timeToNextTrip is not negative timeToNextTrip_h = (timeToNextTrip_h % 8760 + 8760) % 8760; @@ -425,7 +327,7 @@ else if (p_primaryHeatingAsset== null && p_secondaryHeatingAsset != null && v_ha for ( int i = 0; i < copiedVehicleList.size(); i++ ){ J_EAEV ev = copiedVehicleList.get(i); if (ev.vehicleScaling != 0) { - if( !ev.getAvailability() || ev.getCurrentStateOfCharge() == 1 ) { + if( !ev.getAvailability() || ev.getCurrentStateOfCharge_fr() == 1 ) { ev.f_updateAllFlows( 0.0 ); c_vehiclesAvailableForCharging.remove( i - countDeletedItems ); countDeletedItems ++; @@ -434,7 +336,7 @@ else if (p_primaryHeatingAsset== null && p_secondaryHeatingAsset != null && v_ha //traceln("current time: " + energyModel.t_h); //traceln("ev: " + ev); //traceln("dist: " + ev.getTripTracker().v_tripDist_km); - double chargeNeedForNextTrip_kWh = max(0, ev.getEnergyNeedForNextTrip_kWh() - ev.getStorageCapacity_kWh()*ev.getCurrentStateOfCharge()); + double chargeNeedForNextTrip_kWh = max(0, ev.getEnergyNeedForNextTrip_kWh() - ev.getCurrentStateOfCharge_kWh()); //traceln("chargeNeedForNextTrip_kWh: " + chargeNeedForNextTrip_kWh); double maxChargingPower_kW = ev.getCapacityElectric_kW(); double chargeDeadline_h = floor((ev.tripTracker.v_nextEventStartTime_min / 60 - chargeNeedForNextTrip_kWh / maxChargingPower_kW) / energyModel.p_timeStep_h) * energyModel.p_timeStep_h; @@ -487,7 +389,7 @@ else if (p_primaryHeatingAsset== null && p_secondaryHeatingAsset != null && v_ha countDeletedItems ++; } else { //double availableChargingPower_kW = v_allowedCapacity_kW - v_currentPowerElectricity_kW - v_chargingPower_kW; - double chargeNeedForNextTrip_kWh = max(0, vehicle.energyNeedForNextTrip_kWh - vehicle.getStorageCapacity_kWh()*vehicle.getCurrentStateOfCharge()); + double chargeNeedForNextTrip_kWh = max(0, vehicle.energyNeedForNextTrip_kWh - vehicle.getCurrentStateOfCharge_kWh()); //double timeToNexTrip_min = vehicle.getMobilityTracker().v_nextTripStartTime_min - energyModel.t_h*60; double maxChargingPower_kW = vehicle.getCapacityElectric_kW(); double timeToNextTrip_min = vehicle.tripTracker.v_nextEventStartTime_min - energyModel.t_h*60; @@ -504,7 +406,7 @@ else if (p_primaryHeatingAsset== null && p_secondaryHeatingAsset != null && v_ha if ( energyModel.t_h*60 >= chargeDeadline_min & chargeNeedForNextTrip_kWh > 0) { // Must-charge time at max charging power //traceln("Urgency charging! May exceed connection capacity!"); chargeSetpoint_kW = maxChargingPower_kW; - } else if ( vehicle.getCurrentStateOfCharge() < 0.15 ) { + } else if ( vehicle.getCurrentStateOfCharge_fr() < 0.15 ) { chargeSetpoint_kW = min(remainingChargePower_kW, maxChargingPower_kW); } else { //double WTPprice_eurpkWh = v_electricityPriceLowPassed_eurpkWh - flexibilityGain_eurph * (chargeDeadline_min - energyModel.t_h*60 - 600); @@ -531,7 +433,7 @@ else if (p_primaryHeatingAsset== null && p_secondaryHeatingAsset != null && v_ha } if( this instanceof GCHouse){ - ((GCHouse)this).v_vehicleSOC_fr = vehicle.getCurrentStateOfCharge(); + ((GCHouse)this).v_vehicleSOC_fr = vehicle.getCurrentStateOfCharge_fr(); } } @@ -784,7 +686,7 @@ else if (j_ea.energyAssetType == OL_EnergyAssetType.PHOTOTHERMAL){ countDeletedItems ++; } else { //double availableChargingPower_kW = v_allowedCapacity_kW - v_currentPowerElectricity_kW - v_chargingPower_kW; - double chargeNeedForNextTrip_kWh = vehicle.energyNeedForNextTrip_kWh - vehicle.getStorageCapacity_kWh()*vehicle.getCurrentStateOfCharge(); + double chargeNeedForNextTrip_kWh = vehicle.energyNeedForNextTrip_kWh - vehicle.getCurrentStateOfCharge_kWh(); //double timeToNexTrip_min = vehicle.getMobilityTracker().v_nextTripStartTime_min - energyModel.t_h*60; double maxChargingPower_kW = vehicle.getCapacityElectric_kW(); double timeToNextTrip_min = vehicle.tripTracker.v_nextEventStartTime_min - energyModel.t_h*60; @@ -806,7 +708,7 @@ else if (j_ea.energyAssetType == OL_EnergyAssetType.PHOTOTHERMAL){ if ( energyModel.t_h*60 >= chargeDeadline_min & chargeNeedForNextTrip_kWh > 0) { // Must-charge time at max charging power //traceln("Urgency charging! May exceed connection capacity!"); chargeSetpoint_kW = maxChargingPower_kW; - } else if ( vehicle.getCurrentStateOfCharge() < 0.15 ) { + } else if ( vehicle.getCurrentStateOfCharge_fr() < 0.15 ) { chargeSetpoint_kW = min(remainingChargePower_kW, maxChargingPower_kW); } else { //double WTPprice_eurpkWh = v_electricityPriceLowPassed_eurpkWh - flexibilityGain_eurph * (chargeDeadline_min - energyModel.t_h*60 - 600); @@ -836,7 +738,7 @@ else if (j_ea.energyAssetType == OL_EnergyAssetType.PHOTOTHERMAL){ } if( this instanceof GCHouse){ - ((GCHouse)this).v_vehicleSOC_fr = vehicle.getCurrentStateOfCharge(); + ((GCHouse)this).v_vehicleSOC_fr = vehicle.getCurrentStateOfCharge_fr(); } } @@ -1240,55 +1142,6 @@ else if (j_ea.energyAssetType == OL_EnergyAssetType.PHOTOTHERMAL){ v_liveConnectionMetaData.contractedFeedinCapacity_kW += mult * v_nfatoWeekFeedinCapacity_kW[hourOfDay]; } } -/*ALCODEEND*/} - -double f_batteryManagementNodalPricing(double currentBatteryStateOfCharge_fr) -{/*ALCODESTART::1720537137235*/ -if (p_batteryAsset.getStorageCapacity_kWh() != 0){ - //double willingnessToPayDefault_eurpkWh = 0.3; - double WTPfeedbackGain_eurpSOC = 0.2; // When SOC-error is 100%, adjust WTP price by 1 eurpkWh - double priceGain_kWhpeur = 1.0; // How strongly to ramp up power with price-delta's. Increasing this gain too far leads to instability! - //double congestionTariffCoop_eurpkWh = -(((ConnectionOwner)p_ownerActor).p_CoopParent.v_electricitySurplus_kW + v_previousPowerElectricity_kW)/1200*0.1; - - double chargeSetpoint_kW = 0; - double currentElectricityPriceCharge_eurpkWh; - //double currentElectricityPriceDischarge_eurpkWh; - //currentElectricityPriceCharge_eurpkWh = energyModel.nationalEnergyMarket.f_getNationalElectricityPrice_eurpMWh()/1000 + GN.v_currentTotalNodalPrice_eurpkWh; - currentElectricityPriceCharge_eurpkWh = p_parentNodeElectric.v_currentTotalNodalPrice_eurpkWh; - - v_electricityPriceLowPassed_eurpkWh += v_lowPassFactor_fr * ( currentElectricityPriceCharge_eurpkWh - v_electricityPriceLowPassed_eurpkWh ); - - - double SOC_setp_fr = 0.9 + (p_parentNodeElectric.v_totalInstalledPVPower_kW/50_000+p_parentNodeElectric.v_totalInstalledWindPower_kW/20_000)*(0.2 - 3*p_parentNodeElectric.v_electricityYieldForecast_fr); - //double SOC_setp_fr = 0.9 - 2*energyModel.v_WindYieldForecast_fr; - //SOC_setp_fr = (0.5 + 0.4 * Math.cos(2*Math.PI*(energyModel.t_h-18)/24))*(1-3*GN.v_electricityYieldForecast_fr); // Sinusoidal setpoint: aim for high SOC at 18:00h - //SOC_setp_fr = 0.6 + 0.25 * Math.sin(2*Math.PI*(energyModel.t_h-12)/24); // Sinusoidal setpoint: aim for low SOC at 6:00h, high SOC at 18:00h. - - double SOC_deficit_fr = SOC_setp_fr - currentBatteryStateOfCharge_fr; - - //double WTP_eurpkWh = v_electricityPriceLowPassed_eurpkWh + 1.0*(energyModel.v_epexForecast_eurpkWh - v_electricityPriceLowPassed_eurpkWh) + SOC_deficit_fr * WTPfeedbackGain_eurpSOC; - double WTP_eurpkWh = v_electricityPriceLowPassed_eurpkWh + 0.0*(energyModel.v_epexForecast_eurpkWh - v_electricityPriceLowPassed_eurpkWh) + SOC_deficit_fr * WTPfeedbackGain_eurpSOC; - chargeSetpoint_kW = p_batteryAsset.getCapacityElectric_kW()*(WTP_eurpkWh - currentElectricityPriceCharge_eurpkWh)*priceGain_kWhpeur ; - - //chargeSetpoint_kW = min(max(chargeSetpoint_kW, availableDischargePower_kW),availableChargePower_kW); // Don't allow too much (dis)charging! - //p_batteryAsset.v_powerFraction_fr = max(-1,min(1, chargeSetpoint_kW / p_batteryAsset.getElectricCapacity_kW())); // Convert to powerFraction and limit power - boolean b_stayWithinConnectionLimits = true; - if( b_stayWithinConnectionLimits ) { - double maxBatteryPower_kW = v_liveConnectionMetaData.contractedDeliveryCapacity_kW - (fm_currentConsumptionFlows_kW.get(OL_EnergyCarriers.ELECTRICITY) - fm_currentProductionFlows_kW.get(OL_EnergyCarriers.ELECTRICITY)); // Max battery charging power within grid capacity - double minBatteryPower_kW = - (v_liveConnectionMetaData.contractedFeedinCapacity_kW + (fm_currentConsumptionFlows_kW.get(OL_EnergyCarriers.ELECTRICITY) - fm_currentProductionFlows_kW.get(OL_EnergyCarriers.ELECTRICITY))); // Max discharging power within grid capacity (this number is usually negative!) - chargeSetpoint_kW = min(max(chargeSetpoint_kW, minBatteryPower_kW),maxBatteryPower_kW); // Don't allow too much (dis)charging! - /*if (minBatteryPower_kW>0) { - traceln("Battery must charge to prevent curtailment! minBatteryPower_kW: %s, chargeSetpoint_kW: %s, battery SOC: %s", minBatteryPower_kW, chargeSetpoint_kW, currentBatteryStateOfCharge_fr); - }*/ - } - - p_batteryAsset.v_powerFraction_fr = max(-1,min(1, chargeSetpoint_kW / p_batteryAsset.getCapacityElectric_kW())); // Convert to powerFraction and limit power -} - -//traceln("Hello!"); - - - /*ALCODEEND*/} double f_removeFlows(J_FlowsMap flowsMap,double energyUse_kW,J_EA caller) @@ -1355,7 +1208,7 @@ else if (flowsMap.get(EC) > 0){ for (J_EA j_ea : c_fixedConsumptionElectricAssets) { v_fixedConsumptionElectric_kW += j_ea.getLastFlows().get(OL_EnergyCarriers.ELECTRICITY); } -v_liveData.data_baseloadElectricityDemand_kW.add(currentTime_h, v_fixedConsumptionElectric_kW); +v_liveData.data_baseloadElectricityDemand_kW.add(currentTime_h, roundToDecimal(v_fixedConsumptionElectric_kW, 3)); //Cooking @@ -1402,7 +1255,7 @@ else if (flowsMap.get(EC) > 0){ for (J_EA j_ea : c_batteryAssets) { if (((J_EAStorageElectric)j_ea).getCapacityElectric_kW() != 0 && ((J_EAStorageElectric)j_ea).getStorageCapacity_kWh() != 0) { v_batteryPowerElectric_kW += j_ea.getLastFlows().get(OL_EnergyCarriers.ELECTRICITY); - v_batteryStoredEnergy_kWh += ((J_EAStorageElectric)j_ea).getStorageCapacity_kWh()*((J_EAStorageElectric)j_ea).getCurrentStateOfCharge(); + v_batteryStoredEnergy_kWh += ((J_EAStorageElectric)j_ea).getStorageCapacity_kWh()*((J_EAStorageElectric)j_ea).getCurrentStateOfCharge_fr(); } } v_liveData.data_batteryCharging_kW.add(currentTime_h, roundToDecimal(max(0, v_batteryPowerElectric_kW), 3)); @@ -1546,7 +1399,7 @@ else if (flowsMap.get(EC) > 0){ for (J_EA j_ea : c_batteryAssets) { if (((J_EAStorageElectric)j_ea).getCapacityElectric_kW() != 0 && ((J_EAStorageElectric)j_ea).getStorageCapacity_kWh() != 0) { v_batteryPowerElectric_kW += j_ea.getLastFlows().get(OL_EnergyCarriers.ELECTRICITY); - v_batteryStoredEnergy_kWh += ((J_EAStorageElectric)j_ea).getStorageCapacity_kWh()*((J_EAStorageElectric)j_ea).getCurrentStateOfCharge(); + v_batteryStoredEnergy_kWh += ((J_EAStorageElectric)j_ea).getStorageCapacity_kWh()*((J_EAStorageElectric)j_ea).getCurrentStateOfCharge_fr(); } } @@ -1807,22 +1660,13 @@ else if (flowsMap.get(EC) > 0){ double f_getChargeDeadline(J_EAEV ev) {/*ALCODESTART::1725455130676*/ -double chargeNeedForNextTrip_kWh = max(0, ev.getEnergyNeedForNextTrip_kWh() - ev.getStorageCapacity_kWh()*ev.getCurrentStateOfCharge()); +double chargeNeedForNextTrip_kWh = max(0, ev.getEnergyNeedForNextTrip_kWh() - ev.getCurrentStateOfCharge_kWh()); double maxChargingPower_kW = ev.getCapacityElectric_kW(); return floor((ev.tripTracker.v_nextEventStartTime_min / 60 - chargeNeedForNextTrip_kWh / maxChargingPower_kW) / energyModel.p_timeStep_h) * energyModel.p_timeStep_h; /*ALCODEEND*/} -double f_batteryManagementSelfConsumption() -{/*ALCODESTART::1725629047745*/ -if (p_batteryAsset.getStorageCapacity_kWh() != 0){ - double chargeSetpoint_kW = - fm_currentBalanceFlows_kW.get(OL_EnergyCarriers.ELECTRICITY); - // limit charging power to battery max power. - p_batteryAsset.v_powerFraction_fr = max(-1,min(1, chargeSetpoint_kW / p_batteryAsset.getCapacityElectric_kW())); -} -/*ALCODEEND*/} - double f_initializeDataSets() {/*ALCODESTART::1730728785333*/ v_liveData.dsm_liveDemand_kW.createEmptyDataSets(v_activeEnergyCarriers, (int)(168 / energyModel.p_timeStep_h)); @@ -1859,84 +1703,6 @@ else if (flowsMap.get(EC) > 0){ } /*ALCODEEND*/} -double f_batteryManagementPeakShaving() -{/*ALCODESTART::1750763679197*/ -if (p_batteryAsset.getStorageCapacity_kWh() != 0){ - int index = roundToInt((energyModel.t_h % 24)/energyModel.p_timeStep_h); - if(index == 0){ - f_peakShavingForecast_simple(); - } - p_batteryAsset.v_powerFraction_fr = max(-1,min(1, v_batteryChargingForecast_kW[index] / p_batteryAsset.getCapacityElectric_kW())); -} -/*ALCODEEND*/} - -double f_peakShavingForecast_simple() -{/*ALCODESTART::1750763679201*/ -double amountOfHoursInADay = 24; -double[] nettoBalance_kW = new double[96]; - -//Get elec consumption profile -J_EAProfile elecConsumptionProfile = findFirst(c_profileAssets, profile -> profile.profileType == OL_ProfileAssetType.ELECTRICITYBASELOAD); - -J_EAConsumption elecConsumptionConsumptionAsset = findFirst(c_consumptionAssets, cons -> cons.energyAssetType == OL_EnergyAssetType.ELECTRICITY_DEMAND); - -J_EAProduction elecProductionAsset = findFirst(c_productionAssets, prod -> prod.energyAssetType == OL_EnergyAssetType.PHOTOVOLTAIC); - -//For simulation that cross the year end -double hour_of_simulation_year = energyModel.t_h - energyModel.p_runStartTime_h; -//traceln("hour_of_year: " + hour_of_simulation_year); - -int startTimeDayIndex = roundToInt(hour_of_simulation_year/energyModel.p_timeStep_h); -int endTimeDayIndex = roundToInt((hour_of_simulation_year + 24)/energyModel.p_timeStep_h); - -if(elecConsumptionProfile != null){ - nettoBalance_kW = ZeroMath.arrayMultiply(Arrays.copyOfRange(elecConsumptionProfile.a_energyProfile_kWh, startTimeDayIndex, endTimeDayIndex), 1/energyModel.p_timeStep_h); -} -if(elecConsumptionConsumptionAsset != null){ - for(double time = energyModel.t_h; time < energyModel.t_h + 24; time += energyModel.p_timeStep_h){ - nettoBalance_kW[roundToInt((time-energyModel.t_h)/energyModel.p_timeStep_h)] += elecConsumptionConsumptionAsset.profilePointer.getValue(time)*elecConsumptionConsumptionAsset.yearlyDemand_kWh*elecConsumptionConsumptionAsset.getConsumptionScaling_fr(); - } -} - -if(elecProductionAsset != null){ - for(double time = energyModel.t_h; time < energyModel.t_h + 24; time += energyModel.p_timeStep_h){ - nettoBalance_kW[roundToInt((time-energyModel.t_h)/energyModel.p_timeStep_h)] -= elecProductionAsset.profilePointer.getValue(time)*elecProductionAsset.getCapacityElectric_kW(); - } -} - - -////Fill chargesetpoint Array - -//Initialize chargepoint array -v_batteryChargingForecast_kW = new double[96]; - - -//Calculate the total export over the day that can be collected by the battery -double totalExport_kWh = 0; -for(int i = 0; i < nettoBalance_kW.length; i++){ - if(nettoBalance_kW[i] < 0){ - totalExport_kWh += min(p_batteryAsset.getCapacityElectric_kW(), -nettoBalance_kW[i])*energyModel.p_timeStep_h; - } -} - - -//Flatten the morning net balance while charging -double totalDailyImport_kWh = 0; -for(int i = 0; i < nettoBalance_kW.length; i++){ - if(i< amountOfHoursInADay/energyModel.p_timeStep_h){ - totalDailyImport_kWh += max(0,nettoBalance_kW[i]*energyModel.p_timeStep_h); - } -} -double batteryEnergyNeeded_kWh = max(0,(p_batteryAsset.getStorageCapacity_kWh()*(1-p_batteryAsset.getCurrentStateOfCharge()))-totalExport_kWh); -double averageDailyConsumption_kW = (totalDailyImport_kWh + batteryEnergyNeeded_kWh)/amountOfHoursInADay; - -//If 24 hours -for(int i = 0; i < nettoBalance_kW.length; i++){ - v_batteryChargingForecast_kW[i] += averageDailyConsumption_kW - nettoBalance_kW[i]; -} - -/*ALCODEEND*/} - double f_fillLiveDataSets1() {/*ALCODESTART::1751294546436*/ //Current timestep @@ -2066,3 +1832,15 @@ else if (flowsMap.get(EC) > 0){ /*ALCODEEND*/} +double f_manageBattery() +{/*ALCODESTART::1752570332887*/ +if (p_batteryAsset != null) { + if (p_batteryAsset.getStorageCapacity_kWh() > 0 && p_batteryAsset.getCapacityElectric_kW() > 0) { + if (p_batteryAlgorithm == null) { + throw new RuntimeException("Tried to operate battery without algorithm in GC: " + p_gridConnectionID); + } + p_batteryAlgorithm.manageBattery(); + } +} +/*ALCODEEND*/} + diff --git a/_alp/Agents/GridConnection/Code/Functions.xml b/_alp/Agents/GridConnection/Code/Functions.xml index 80aa56e7..e0f2bca0 100644 --- a/_alp/Agents/GridConnection/Code/Functions.xml +++ b/_alp/Agents/GridConnection/Code/Functions.xml @@ -96,46 +96,6 @@ true - - VOID - double - 1669022552777 - - 920 - 280 - - false - false - true - - - - - - - - VOID - double - 1669022552780 - - 920 - 300 - - false - true - true - - - - - - VOID double @@ -511,30 +471,6 @@ - - VOID - double - 1720537137235 - - - 920.6 - 319.4 - - false - true - true - - - - - - VOID double @@ -636,22 +572,6 @@ - - VOID - double - 1725629047745 - - 920 - 260 - - false - true - true - - VOID double @@ -687,26 +607,11 @@ VOID double - 1750763679197 - - 920 - 340 - - false - true - true - - - - VOID - double - 1750763679201 - - 950 - 360 + 1751294546436 + + true + 1610 + 90 - - 1668695288485 - - 1270 - 350 - - false - true - true - - - - - - - 1669725778092 @@ -366,26 +344,6 @@ - - 1677585426154 - - true - 1270 - 490 - - false - true - true - - - - 1678710234324 @@ -408,25 +366,6 @@ - - 1678710234329 - - 1270 - 450 - - false - true - true - - - - 1695824940090 @@ -1090,28 +1029,6 @@ - - 1750763679203 - - 970 - 380 - - false - true - true - - - - - - - 1751442438903 @@ -1425,34 +1342,6 @@ - - 1668693418082 - - 270 - 140 - - false - true - true - - - NONE - false - - - - - 1668693418080 - TEXT_BOX - 0 - 100 - NO_DELIMETER - - - 1668695364192 @@ -1535,7 +1424,7 @@ 1684919785784 600 - 470 + 490 + + 1752752664510 + + 620 + 470 + + false + true + true + + + NONE + false + + 1752752664508 + TEXT_BOX + 0 + 100 + NO_DELIMETER + + + 1659962626903 @@ -2403,7 +2317,7 @@ 1750258408126 600 - 491 + 511