diff --git a/CHANGELOG.md b/CHANGELOG.md index 7ab57cf83..3abbbb7fc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,11 @@ Classify the change according to the following categories: ##### Removed ### Patches +## v3.12.3 +### Minor Updates +### Added +- Add inputs: **PV.acres_per_kw** and **PV.kw_per_square_foot** + ## v3.12.2 ### Patches - Enable the downloadable results spreadsheet (`job/generate_results_table` endpoint) to work with previous runs by avoiding errors when trying to do math with values of type None - handle None as zero/0 diff --git a/reoptjl/migrations/0081_pvinputs_acres_per_kw_pvinputs_kw_per_square_foot.py b/reoptjl/migrations/0081_pvinputs_acres_per_kw_pvinputs_kw_per_square_foot.py new file mode 100644 index 000000000..a3069968c --- /dev/null +++ b/reoptjl/migrations/0081_pvinputs_acres_per_kw_pvinputs_kw_per_square_foot.py @@ -0,0 +1,24 @@ +# Generated by Django 4.0.7 on 2025-03-04 16:40 + +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('reoptjl', '0080_electricloadoutputs_annual_electric_load_with_thermal_conversions_kwh_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='pvinputs', + name='acres_per_kw', + field=models.FloatField(blank=True, default=0.006, help_text='The acres per kW-DC for ground-mount PV systems in acres per kW, accounting for setbacks, row spacing, etc. The recommended PV system size is constrained based on the sum of land area available, assuming the ground-mount power density specified here, and roofspace available, assuming the specified rooftop power density.', validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(10)]), + ), + migrations.AddField( + model_name='pvinputs', + name='kw_per_square_foot', + field=models.FloatField(blank=True, default=0.01, help_text='The installed power density for rooftop PV systems in kW per square foot, accounting for setbacks, row spacing, etc. The recommended PV system size is constrained based on the sum of land area available, assuming the specified ground-mount power density, and roofspace available, assuming the rooftop power density specified here.', validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(10)]), + ), + ] diff --git a/reoptjl/migrations/0084_merge_20250424_1814.py b/reoptjl/migrations/0084_merge_20250424_1814.py new file mode 100644 index 000000000..1b5c69acd --- /dev/null +++ b/reoptjl/migrations/0084_merge_20250424_1814.py @@ -0,0 +1,14 @@ +# Generated by Django 4.0.7 on 2025-04-24 18:14 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('reoptjl', '0081_pvinputs_acres_per_kw_pvinputs_kw_per_square_foot'), + ('reoptjl', '0083_electricutilityoutputs_peak_grid_demand_kw_and_more'), + ] + + operations = [ + ] diff --git a/reoptjl/models.py b/reoptjl/models.py index 6a33b9daa..fdef159a8 100644 --- a/reoptjl/models.py +++ b/reoptjl/models.py @@ -2984,6 +2984,26 @@ class PV_LOCATION_CHOICES(models.TextChoices): blank=True, help_text="Where PV can be deployed. One of [roof, ground, both] with default as both." ) + kw_per_square_foot = models.FloatField( + default=0.01, + validators=[ + MinValueValidator(0), + MaxValueValidator(10) + ], + blank=True, + help_text=("The installed power density for rooftop PV systems in kW per square foot, accounting for setbacks, row spacing, etc. The recommended PV system size is constrained " + "based on the sum of land area available, assuming the specified ground-mount power density, and roofspace available, assuming the rooftop power density specified here.") + ) + acres_per_kw = models.FloatField( + default=0.006, + validators=[ + MinValueValidator(0), + MaxValueValidator(10) + ], + blank=True, + help_text=("The acres per kW-DC for ground-mount PV systems in acres per kW, accounting for setbacks, row spacing, etc. The recommended PV system size is constrained " + "based on the sum of land area available, assuming the ground-mount power density specified here, and roofspace available, assuming the specified rooftop power density.") + ) production_factor_series = ArrayField( models.FloatField( blank=True