Recent Feature Additions#

Version 2.1.3#

Plotting bug fix#

Plotting broke after the last release. The bug has been fixed.

Tariff model added#

The tariff model can now be imnported using the code snippet below. In future release we will add model representations for aggregators and other market models

from gdm.distribution.market import DistributionTariff

DistributionTariff.example().pprint()
DistributionTariff(
    name='Residential Summer Tariff',
    utility='Example Utility',
    customer_class=<CustomerClass.RESIDENTIAL: 'residential'>,
    fixed_charge=FixedCharge(name='', amount=15.0, description='Monthly fixed customer charge'),
    seasonal_tou=[
        SeasonalTOURates(
            name='',
            season=<Season.SUMMER: 'summer'>,
            tou_periods=[
                TOURatePeriod(
                    name='',
                    start_time=datetime.time(14, 0),
                    end_time=datetime.time(20, 0),
                    rate=0.25,
                    period_type=<TOUPeriodType.PEAK: 'peak'>
                ),
                TOURatePeriod(
                    name='',
                    start_time=datetime.time(20, 0),
                    end_time=datetime.time(23, 59),
                    rate=0.15,
                    period_type=<TOUPeriodType.OFF_PEAK: 'off_peak'>
                )
            ]
        ),
        SeasonalTOURates(
            name='',
            season=<Season.WINTER: 'winter'>,
            tou_periods=[
                TOURatePeriod(
                    name='',
                    start_time=datetime.time(14, 0),
                    end_time=datetime.time(20, 0),
                    rate=0.25,
                    period_type=<TOUPeriodType.PEAK: 'peak'>
                ),
                TOURatePeriod(
                    name='',
                    start_time=datetime.time(0, 0),
                    end_time=datetime.time(6, 0),
                    rate=0.1,
                    period_type=<TOUPeriodType.OFF_PEAK: 'off_peak'>
                )
            ]
        )
    ],
    demand_charges=[
        DemandCharge(
            name='',
            rate=12.5,
            billing_demand_basis=<BillingDemandBasis.PEAK_15MIN: 'peak_15min'>,
            time_applicability=[
                TOURatePeriod(
                    name='',
                    start_time=datetime.time(14, 0),
                    end_time=datetime.time(20, 0),
                    rate=0.25,
                    period_type=<TOUPeriodType.PEAK: 'peak'>
                )
            ]
        )
    ],
    tiered_energy_charges=[TieredRate(name='', upper_limit_kwh=500.0, rate=0.12)]
)

Version 2.1.2#

Support to line impedance calculations#

\(\quad\) GeometryBranch models can now be converted to MatrixImpedanceBranch model representation using the to_matrix_representation method.

from gdm.distribution.components import GeometryBranch, MatrixImpedanceBranch

g = GeometryBranch.example()
h: MatrixImpedanceBranch = g.to_matrix_representation()

\(\quad\) All GeometryBranch models in a given system can noe be replaced with MatrixImpedanceBranch model representation using the convert_geometry_to_matrix_representation method for DistributionSystem objects.

from gdm.distribution import DistributionSystem

sys = DistributionSystem.from_json(filename=<path to model>) 
sys.convert_geometry_to_matrix_representation()

Change to TrackChange object#

\(\quad\) update_date has been changed to timestamp. Now requires datetime object rather than date object..

class TrackedChange(InfraSysBaseModel):
    .
    .
    .
    
    update_date: Annotated[
        timestamp | None,
        Field(
            None,
            description="If these changes are to be applied on specific timestamp, provide a timestamp, else leave it blank",
        ),
    ]
    .
    .
    .

Version 2.1.0#

Improved validation for physical quantities#

\(\quad\) All Positive quantities have been removed. Additional constraints are now applied using Pydantic Field class. Reduces the number of class definations for physical quantities significantly.

Initial implementation to manage backward compatability for DistributionSystems#

\(\quad\) Going forward (v2.0.0 onwards), users will be able to load older models with newer GDM installations by passing the upgrade handler object, when loading the model from a json file.

from gdm.distribution import DistributionSystem
from gdm.distribution.upgrade_handler.upgrade_handler import UpgradeHandle

upgrade_handler = UpgradeHandler()
DistributionSystem.from_json(filename=<path to model>) 
upgrade_handler=upgrade_handler.upgrade)

Support to create a deepcopy of GDM system#

\(\quad\) Added functionality to easily create a deep copy of any GDM system object, ensuring that modifications to the copy do not affect the original instance.

from gdm.distribution import DistributionSystem

system = DistributionSystem.from_json(filename=<path to model>)
system_copy = system.deepcopy()