Energy API
BESS(E_terminal_theor, SOCkwh_tm1, ε_roundtrip_halfcycle, battery_min_kwh, battery_max_kwh, flag_battery_to_grid=0, battery_to_grid_capacity=0)
The function makes a simplified model of a Battery Energy Storage System, as it does not take into account of any voltage, temperature, C-rate and other battery parameters. Terminology: gross before applying the half cycle roundtrip efficiency losses net after applying the half cycle roundtrip efficiency losses theroetical before checking applying the DoD lower limit, assuming infinite battery capacity real after checking the battery upper (100% SOC) and lower limits (DoD)
Inputs
E_terminal_theor energy flux theoretically available at the battery terminals, given by the PV production at that timestep. Sign convention: charging (+) and discharging (-) SOCkwh_tm1 battery State Of Charge at the t-1 timestep, expressed in kWh ε_roundtrip_halfcycle roundtrip efficiency of a half cycle (assuming same losses for charge and discharge) battery_min_kwh minimum acceptable value of kWh in the battery, above which the battery goes in protection and stops the discharge. It's related to the Dept of Discharge lower limit (f.i. in this case DoD = 80%, means 20% is the lower boundary), set by the installer/manufacturer in the BMS. Expressed in kWh battery_max_kwh max value of kWh in the battery, here assumed equal to the rated capacity (100% SOC) flag_battery_to_grid flag. If 1, battery injects power into the grid to share with other REC users. If 0, only self-consumption. Default is 0, no battery-to-grid injection battery_to_grid_capacity max kWh limit that the battery can inject into the grid in the delta t interval. It'r related to the discharge C-rate. It's the limit set by the inverter to the grid, configured by the user. Default is 0
Outputs: E_terminal_real real energy flow at the battery, as a result of losses . <0 se scarica cedendo energia al sistema, >0 se carica assorbendo dal sistema E_losses transformation losses at the battery terminals for receiving or injecting that energy SOC_kWh updated State Of Charge at timestep t, in kWh SOC_perc updated State Of Charge at timestep t, in %
Source code in src\Functions_Energy_Model.py
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | |
CACER_energy_flows()
Simulates the energy flows for all the members of the CACER, for all the timesteps of the model.
This function calculates the energy flows for users with and without energy storage systems. It reads configurations and user data from files, checks necessary folders, and clears old results. The function then simulates the energy flows for each user based on their typology (consumer, producer, prosumer) and whether they have a Battery Energy Storage System (BESS). Results are exported to CSV files.
For the users without storage, the simulation is non time dependant (meaning what happens in timestep t-1 has no influence on timestep t) thus a calculation by vectors is used. When storage is present, iterative calculation (time consuming) is needed, as there is interdependence between timesteps (battery SOC of time t-1 plays as role in establishing where energy flows to in timestep t).
Global Variables
t (int): Current timestep of the simulation. user (str): Current user being simulated. user_type (str): Type of the current user. battery_cumulative_charge (dict): Cumulative charge of the battery for each user. SOCkWh_tm1 (dict): State of Charge (SOC) in kWh at the previous timestep for each user. result (dict): Dictionary to store the results of the simulation for each user. load_profiles (DataFrame): Load profiles for each user. generation (DataFrame): Generation profiles for each user. dod (float): Depth of discharge. battery_derating_factor (float): Factor for battery capacity degradation over cycles. ε_roundtrip_halfcycle (float): Efficiency of a half charge-discharge cycle. user_types_set (dict): Configuration of user types and their attributes. config (dict): Configuration settings loaded from a YAML file.
Input Files
config.yml: Configuration file with simulation parameters. filename_carichi: CSV file with load profiles. filename_output_csv_gen_pv: CSV file with generation profiles. filename_registry_user_types_yml: YAML file with user types registry. filename_plant_operation_matrix: Excel file with plant operation data.
Output
CSV files for each user with energy flow data, saved to the configured output directory.
Source code in src\Functions_Energy_Model.py
250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 | |
CACER_injected_energy_optimizer()
Calculates and exports the energy injected into the grid for the optimizer.
This function calculates the energy withdrawn from the grid, the energy injected into the grid, and the net injected energy for the optimizer. It exports the results to a CSV file.
Outputs
- A CSV file with the energy injected into the grid for the optimizer.
Source code in src\Functions_Energy_Model.py
1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 1915 1916 1917 1918 1919 1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930 1931 1932 1933 1934 1935 1936 1937 1938 1939 1940 1941 1942 1943 1944 1945 1946 1947 1948 1949 1950 1951 1952 1953 1954 1955 1956 1957 | |
CACER_shared_energy()
Calls the functions to calculate the shared energy for the TIP and the valorization.
Source code in src\Functions_Energy_Model.py
1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 | |
CACER_shared_energy_for_TIP()
Calculates and exports the shared energy for TIP (Tariff Incentive Premimum) for each configuration.
This function processes energy exchange data for each configuration, identifying the energy withdrawal and injection for incentive purposes. It calculates the shared energy based on the minimum of energy withdrawn and injected, allocates the shared energy to each plant based on seniority, and exports the results both hourly and yearly.
The function also handles cases where no CACER is present, exporting zero-filled dataframes in such cases.
Outputs
- Two CSV files with the shared energy data for TIP: one with hourly data and another with yearly data.
Source code in src\Functions_Energy_Model.py
1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 | |
CACER_shared_energy_for_valorization()
Calculates and exports the shared energy for VALORIZZAZIONE ARERA for each configuration.
This is similar to the CACER_shared_energy_for_TIP function, but focused on the VALORIZZAZIONE ARERA. The calculation is slightly different, as for TIP it's necessary to check the seniority of each plant and reconduct the shared energy generated by ach plant, as TIP tariff changes based on the installed capacity and location.
For the valorization, the shared energy calculation is simplified, but needs to consider the voltage level, as described in the TIAD formula. Thus there is a need to distinguish the shared enerrgy for the 2 different purposes, even if in most of the cases the final values will be exactly the same.
This function processes energy data for each configuration, identifying energy withdrawal and injection at different voltage levels for valorization purposes. It calculates the shared energy based on the minimum of energy withdrawn and injected, aggregates the energy data by voltage level, and exports the results on both an hourly and monthly basis.
The function also manages cases where no CACER is present, exporting zero-filled dataframes in such cases. Additionally, it calculates and saves user-specific energy profiles and aggregated energy flows for reporting purposes.
Outputs
- CSV files with shared energy data on an hourly basis.
- Excel files with monthly aggregated energy data for each user type and configuration.
- Updates the recap YAML file with percentage of consumer withdrawals on total.
Source code in src\Functions_Energy_Model.py
1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745 1746 1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767 1768 1769 1770 1771 1772 1773 1774 1775 1776 1777 1778 1779 1780 1781 1782 1783 1784 1785 1786 1787 1788 1789 1790 1791 1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804 1805 1806 1807 1808 1809 1810 1811 1812 1813 1814 1815 1816 1817 1818 1819 1820 1821 1822 1823 1824 1825 1826 1827 1828 1829 1830 1831 1832 1833 1834 1835 1836 1837 1838 1839 1840 1841 1842 1843 1844 1845 1846 1847 1848 1849 1850 1851 1852 1853 1854 1855 1856 1857 1858 1859 | |
DSM_load_profile_emulator(emulated_users_list, DSM_emulated_users_list, start_day, end_day, flag_all_appliance=True, flag_daily_activation=True, flag_multi_use=True)
Simulate all user load profile with DSM (Demand Side Management). Inputs: emulated_users_list (list): list of users to simulate DSM_emulated_users_list (list): list of users to simulate with DSM start_day (datetime): start day for simulation end_day (datetime): end day for simulation flag_all_appliance (bool, optional): if false we use as input file the modified appliance load profile. Defaults to True. flag_daily_activation (bool, optional): if false we dont'use a daily usage activation for some specified appliances. Defaults to True. flag_multi_use (bool, optional): if true we activate the possibility to have multiple activations for the selected appliances during the day. Defaults to True. Outputs: all_user_df: This dataframe has an unstacked structure and is created with timestep on rows (entire time range) and users
Source code in src\Functions_Load_Emulator_and_DSM.py
897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 | |
add_appliance(appliance_profile, start_time, day, user_consumption_df, df_2)
Add the appliance to the user consumption dataframe.
Inputs
appliance_profile (dataframe): appliance load profile start_time (int): start time of the appliance day (int): day of the simulation user_consumption_df (dataframe): user consumption dataframe df_2 (dataframe): dataframe to add the appliance
Outputs
user_consumption_df: updated user consumption dataframe df_2: updated dataframe to add the appliance
Source code in src\Functions_Load_Emulator_and_DSM.py
268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 | |
change_index(df, gen_data)
Change the index of a dataframe to include location and capacity of each generator.
Parameters df : pandas.DataFrame to change the index of. gen_data : dict with the location and capacity of each generator.
Returns df : pandas.DataFrame with the modified index.
Source code in src\Functions_Energy_Model.py
1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 | |
check_calendar_status()
Function to check if the calendar is updated with the correct number of values.
The function reads the start_date and project_lifetime_yrs from the config file, then calculates the total number of values that the calendar should have considering the project lifetime and the delta_t.
Finally, it checks if the actual number of values in the calendar is equal to the total number of values calculated.
If the check fails, an assert error is raised with a message asking to run the function <
Source code in src\Functions_Energy_Model.py
1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433 1434 1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 | |
check_inverter(module)
selecting the inverter who respects the limits of power, voltage and current for the module in input Inputs: module module item and its parameters Outputs: inverter inverter item and its parameters
Source code in src\Functions_Energy_Model.py
772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 | |
comparison_average_load_profile_arera_profile(all_user_load_profile, month)
Plot the average load profile for all users and the arera load profile for the selected month.
Inputs
all_user_load_profile (dict): dictionary with all load profile for each day for every users (timesteps on rows and user_id on columns) month (int): month to plot
Outputs
plot of the average load profile for all users and the arera load profile for the selected month
Source code in src\Functions_Load_Emulator_and_DSM.py
1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 | |
create_all_user_appliance_DSM_start_time(DSM_emulated_users_list, num_days, calendario, flag_daily_activation=True, flag_multi_use=True)
Create all user DSM (Demand Side Management) appliance start time.
In particular, we use the dictionary created before for a noDSM case and modify the start time of specified appliances with
a different daily usage probability concentrate in the productivity period (we set equal to zeros all usage probabilities
out of the productivity period in way to be sure that the activation of the flex appliaces is inside this period).
Inputs
num_days (float): number of days to simulate calendario (dataframe): calendar flag_daily_activation (bool, optional): if false we dont'use a daily usage activation for some specified appliances. Defaults to True. flag_multi_use (bool, optional): if true we activate the possibility to have multiple activations for the selected appliances during the day. Defaults to True.
Outputs
all_user_appliance_start_time_dict_1: dictionary with the start time for the first use of the appliance all_user_appliance_start_time_dict_2: dictionary with the start time for the second use of the appliance (if activated) all_user_appliance_start_time_dict_3: dictionary with the start time for the third use of the appliance (if activated)
Source code in src\Functions_Load_Emulator_and_DSM.py
612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 | |
create_all_user_appliance_load_profile(start_time_dict, emulated_users_list, num_days, flag_DSM)
Create all user appliance load profile for all days fixed using the start time simulated.
Inputs
start_time_dict (dict): start time for the appliance emulated_users_list (list): list of users to simulate num_days (int): number of days to simulate flag_DSM (bool): if true we simulate a demand side management scenario
Outputs
all_user_appliance_load_profile_dict: dictionary with all appliance load profile for each day for all the users under exam
Source code in src\Functions_Load_Emulator_and_DSM.py
503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 | |
create_all_user_appliance_start_time(emulated_users_list, num_days, calendario, flag_daily_activation=True, flag_multi_use=True)
Create all user appliance start time for all days fixed.
Inputs
emulated_users_list (list): list of users to simulate num_days (int): number of days to simulate calendario (dataframe): calendar flag_daily_activation (bool, optional): if false we dont'use a daily usage activation for some specified appliances. Defaults to True. flag_multi_use (bool, optional): if true we activate the possibility to have multiple activations for the selected appliances during the day. Defaults to True.
Outputs
all_user_appliance_start_time_dict_1: dictionary with the start time for the first use of the appliance all_user_appliance_start_time_dict_2: dictionary with the start time for the second use of the appliance (if activated) all_user_appliance_start_time_dict_3: dictionary with the start time for the third use of the appliance (if activated)
Source code in src\Functions_Load_Emulator_and_DSM.py
212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 | |
create_all_user_load_profile(start_time_dict_1, start_time_dict_2, start_time_dict_3, emulated_users_list, num_days, flag_DSM, flag_all_appliance=True)
Create all user load profile over all days fixed using the start time simulated.
Inputs
start_time_dict_1 (dict): Start time for the first use of the appliance start_time_dict_2 (dict): Start time for the second use of the appliance (if activated) start_time_dict_3 (dict): Start time for the third use of the appliance (if activated) num_users (float): number of users to simulate num_days (float): number of days to simulate flag_DSM (bool): if true we simulate a demand side management scenario flag_all_appliance (bool, optional): if false we don't use all appliances in the user load profile simulation. Defaults to True.
Outputs
all_user_load_profile_dict: dictionary with all load profile for all days simulated for all users fixed
Source code in src\Functions_Load_Emulator_and_DSM.py
379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 | |
create_appliance_load_profile(start_time_df, num_days)
Create a dictionary with all appliance load profile for each day for the user under exam.
Inputs
start_time_df (dataframe): start time for the appliance num_days (int): number of days to simulate
Outputs
appliance_consumption_dict: dictionary with all appliance load profile for each day for the user under exam
Source code in src\Functions_Load_Emulator_and_DSM.py
439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 | |
create_appliance_start_time(num_days, calendario, flag_daily_activation=True, flag_multi_use=True)
This function create a dataframe with the start time for the appliance under exam.
Inputs
num_days (int): number of days to create calendario (dataframe): calendar flag_daily_activation (bool, optional): if false we dont'use a daily usage activation for some specified appliances. Defaults to True. flag_multi_use (bool, optional): if true we activate the possibility to have multiple activations for the selected appliances during the day. Defaults to True.
Outputs
start_time_df_1: dataframe with the start time for the first use of the appliance start_time_df_2: dataframe with the start time for the second use of the appliance (if activated) start_time_df_3: dataframe with the start time for the third use of the appliance (if activated)
Source code in src\Functions_Load_Emulator_and_DSM.py
78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 | |
create_coordinates_dataset(locations_input)
we create a dataset in which we save for each location under exam the values of latitude, longitude, name, altitude and time zone Inputs: locations_input list with the name of the locations under exam [list] Outputs: coordinates_dataset list of the parameters for each location under exam [list]
Source code in src\Functions_Energy_Model.py
648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 | |
create_optimal_appliance_start_time_dictionary()
Create the optimal appliance start time dictionary for the users that partecipate to DSM in CER.
Outputs
optimal appliance start time dictionary for the users that partecipate to DSM in CER
Source code in src\Functions_Load_Emulator_and_DSM.py
1435 1436 1437 1438 1439 1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451 1452 1453 1454 1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 | |
create_single_user_load_profile(start_time_df_1, start_time_df_2, start_time_df_3, num_days, appliances_list)
Create a single user load profile over all days fixed using the start time simulated.
Inputs
start_time_df_1 (dataframe): start time for the first use of the appliance start_time_df_2 (dataframe): start time for the second use of the appliance (if activated) start_time_df_3 (dataframe): start time for the third use of the appliance (if activated) num_days (int): number of days to simulate appliances_list (list): list of appliances to simulate
Outputs
user_consumption_df: user load profile
Source code in src\Functions_Load_Emulator_and_DSM.py
307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 | |
create_single_user_load_profile_df(all_user_load_profile_dict, calendario, flag_DSM)
We change the structure of the dictionary in input. With this function we will obtain an unified dataframe with timestep on rows and different users on columns.
Inputs
all_user_load_profile_dict (dict): dictionary with all load profile for each day for every users (timesteps on rows and user_id on columns) calendario (dataframe): calendar flag_DSM (bool): if true we simulate a demand side management scenario
Outputs
all_user_df: This dataframe has an unstacked structure and is created with timestep on rows (entire time range) and users on columns.
Source code in src\Functions_Load_Emulator_and_DSM.py
550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 | |
datetime_range(start, end, delta)
This function create a list with all timesteps in the range between start and end datetime.
Inputs
start (datetime): starting datetime end (datetime): ending datetime delta (timedelta): time step
Outputs
list: list with all timesteps in the range between start and end datetime
Source code in src\Functions_Load_Emulator_and_DSM.py
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 | |
export_energy_exchange_profiles_csv()
creating the profile of the energy exchange with the grid for each user type, as csv, needed for the Load Flow Module
Source code in src\Functions_Energy_Model.py
1455 1456 1457 1458 1459 1460 1461 1462 1463 1464 1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 | |
export_users_csv()
si esportano i flussi di energia per tutti i singoli utenti, in formato csv
Source code in src\Functions_Energy_Model.py
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 | |
generate_calendar_modified(start_day, end_day)
Generate a calendar with the specified start and end dates.
Inputs
start_day datetime, starting date to generate the calendar end_day datetime, ending date to generate the calendar
Outputs
cal dataframe con datetime, working_day (0=lunedi, 6=domenica), holiday (True False) and Tariff (1,2,3)
Source code in src\Functions_General.py
257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 | |
get_coordinates(address)
we evaluate the latitude and the longitude of a location in input as "address" (it needs just the name of the location, ex. "Roma") Inputs: address the name of the location you want to evaluate latitude and longitude [str] Outputs: location.latitude latitude of the location [float] location.longitude longitude of the location [float]
Source code in src\Functions_Energy_Model.py
631 632 633 634 635 636 637 638 639 640 641 642 643 644 | |
get_html_graph(df, title, y_parameter, xaxis_label, yaxis_label, path)
Function to generate a html graph from a given dataframe with a specified title, y parameter, x and y labels, and path.
Parameters df : pandas.DataFrame to generate the graph from. title : str title of the graph. y_parameter : float to divide the y values by. xaxis_label : str to label the x axis. yaxis_label : str to label the y axis. path : str path to save the graph to.
Returns fig : plotly.graph_objs.Figure the generated figure.
Source code in src\Functions_Energy_Model.py
1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 | |
get_input_gens_analysis()
Reading the data from the yaml file and save them into the internal variables of the script
Outputs
locations_input capacity_input gen_data
Source code in src\Functions_Energy_Model.py
587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 | |
import_users_energy_flow_single_column(user_type_set, energy_column)
exports a dataframe with timesteps on index and user_types (given as input) on columns, filled with values of the energy_column (f.i. "Eimm") given as input
Source code in src\Functions_Energy_Model.py
461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 | |
import_users_energy_flows(user_type_set)
Function to import energy flows of all users of a given type given in input. The function aggregates the load profiles of all the user types (one column per user type) and returns a single dataframe. Parameters user_type_set : list with the user types of interest
Source code in src\Functions_Energy_Model.py
423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 | |
load_profile_emulator(emulated_users_list, start_day, end_day, flag_last_dict=False, flag_optDSM=False, flag_all_appliance=True, flag_daily_activation=True, flag_multi_use=True)
Simulate all user load profile.
Inputs
num_users (float): number of users start_day (datetime): start day for simulation end_day (datetime): end day for simulation flag_last_dict (bool, optional): if true we use the last simulated appliance start time to create the load profile. Defaults to False. flag_optDSM (bool, optional): if true we use the optimized simulated appliance start time to create the load profile. Defaults to False. flag_all_appliance (bool, optional): if false we use as input file the modified appliance load profile. Defaults to True. flag_daily_activation (bool, optional): if false we dont'use a daily usage activation for some specified appliances. Defaults to True. flag_multi_use (bool, optional): if true we activate the possibility to have multiple activations for the selected appliances during the day. Defaults to True.
Outputs: all_user_df: This dataframe has an unstacked structure and is created with timestep on rows (entire time range) and users
Source code in src\Functions_Load_Emulator_and_DSM.py
799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 | |
mergedict(a, b)
Merge two dictionaries into one. The values of the second dictionary will overwrite the values of the first one in case of common keys.
Source code in src\Functions_Energy_Model.py
131 132 133 134 135 136 | |
plot_all_day_appliance_load_profile(user, appliance)
Plot the appliance load profile for the user under exam for all days.
Inputs
user (str): user id appliance (str): appliance id df (dataframe): dataframe with the appliance load profile for the user under exam
Outputs
plot of the appliance load profile for the user under exam for all days
Source code in src\Functions_Load_Emulator_and_DSM.py
1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 | |
plot_all_day_load_profile(all_user_load_profile, user)
Plot the load profile for the user under exam for all days.
Inputs
all_user_load_profile (dict): dictionary with all load profile for each day for every users (timesteps on rows and user_id on columns) user (str): user id
Outputs
plot of the load profile for the user under exam for all days
Source code in src\Functions_Load_Emulator_and_DSM.py
1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 | |
plot_appliance_usage_probability()
Plot the average load profile for all appliances for the user under exam.
Internal inputs
usage_probability_df (dataframe): dataframe with the usage probability for all appliances for the user under exam
Outputs
plot of the average load profile for all appliances for the user under exam
Source code in src\Functions_Load_Emulator_and_DSM.py
1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 | |
plot_average_users_load_profile(all_user_load_profile, plot_type)
Plot the average load profile for all users.
Inputs
all_user_load_profile (dict): dictionary with all load profile for each day for every users (timesteps on rows and user_id on columns) plot_type (str): type of plot (scatter plot or bar plot)
Outputs
plot of the average load profile for all users
Source code in src\Functions_Load_Emulator_and_DSM.py
1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 | |
plot_single_user_appliance_load_profile(all_user_appliance_load_profile_dict, id_user, day)
Plot the appliance load profile for the user under exam for the selected day.
Inputs
all_user_appliance_load_profile_dict (dict): dictionary with all appliance load profile for each day for the user under exam id_user (str): user id day (int): day to plot
Outputs
plot of the appliance load profile for the user under exam for the selected day
Source code in src\Functions_Load_Emulator_and_DSM.py
1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 | |
run_load_emulator_v1(flag_last_dict=False, flag_optDSM=False, flag_all_appliance=True, flag_daily_activation=True, flag_multi_use=True)
Create emulated load profile (and eventually DSM emulated load profile) for all emulated users setted in the user CACER.xlsx external file.
Inputs
flag_last_dict (bool, optional): if true we use the last simulated appliance start time to create the load profile. Defaults to False. flag_optDSM (bool, optional): if true we use the optimized simulated appliance start time to create the load profile. Defaults to False. flag_all_appliance (bool, optional): if false we use as input file the modified appliance load profile. Defaults to True. flag_daily_activation (bool, optional): if false we dont'use a daily usage activation for some specified appliances. Defaults to True. flag_multi_use (bool, optional): if true we activate the possibility to have multiple activations for the selected appliances during the day. Defaults to True.
Outputs
all_user_df: This dataframe has an unstacked structure and is created with timestep on rows (entire time range) and users
Source code in src\Functions_Load_Emulator_and_DSM.py
961 962 963 964 965 966 967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 | |
select_desired_module(desired_pow_value)
Selecting the module with the desired nominal power Inputs: desired_pow_value value of the desired power of the module in (W) [float] Outputs: module module item and its parameters
Source code in src\Functions_Energy_Model.py
724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 | |
set_system()
we select the module and the inverter Inputs: - Outputs: module module item and its parameters (we fix a module with a nominal power of 100 W) inverter inverter item and its parameters (we fix an inverter who respects the limits of power, voltage and current of the selected module)
Source code in src\Functions_Energy_Model.py
685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 | |
set_values_to_zero(data, index, delta)
Set the values in the specified range to zero.
Inputs
data list, list of values to modify index int, index of the value to modify delta int, range of values to modify
Outputs
data list, modified list of values
Source code in src\Functions_Load_Emulator_and_DSM.py
32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | |
simulate_1_kWp_generators(coordinates_dataset, tilt_angle, azimuth)
calculating the productivity for a photovoltaic generator with an installed capacity of 1 kWp for the selected locations using hourly time interval and obtaining a dictionary as output, in which the keys are the input locations. Inputs: gen_data dictionary with {'location' : location, 'capacity' : capacity, 'tilt_angle' : tilt_angle, 'azimuth' : azimuth} Outputs: result_ac_energies_resampled dictionary in which we save the results for each time iteration in (kWh / delta t) [dict]
Source code in src\Functions_Energy_Model.py
520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 | |
simulate_1_kWp_productivity(module, result_ac_energies)
calculating the productivity for a photovoltaic system of 1 kWp in different time interval (delta t, daily, monthly, yearly) Inputs: module module type and its parameters result_ac_energies dictionary in which we save the results for each time iteration in (kWh / delta t) for 100 Wp photovoltaic generator [dict] Outputs: result_ac_energies_1kWp dictionary in which we save the results for each time iteration in (kWh) for 1 kWp photovoltaic generator [dict]
Source code in src\Functions_Energy_Model.py
1053 1054 1055 1056 1057 1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 | |
simulate_configuration_productivity()
we calculate the productivity for each installed photovoltaic generators of the configuration under exam in different time interval (1 hour, daily, monthly)
Outputs
output_gen_pv.csv .csv file
Source code in src\Functions_Energy_Model.py
555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 | |
simulate_gens_derated_productivity(derating_factor, result_ac_energies_gens)
calculating the productivity for each generator with different capacity and applying the derating factor in different time interval (1 hour, daily, monthly, yearly) Inputs: result_ac_energies_gens dictionary in which we save the results for each time iteration in (kWh / delta t) [dict] Outputs: result_ac_energies_gens_derated dictionary in which we save the results for each time iteration in (kWh / delta t) considering an annual production derating [dict]
Source code in src\Functions_Energy_Model.py
1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 | |
simulate_gens_productivity()
calculating the productivity for each generator with different capacity in different time interval (1 hour, daily, monthly, yearly) Outputs: result_ac_energies_gens dictionary with the results for an entire year for every pv plant (different capactity and plant parameters)
Source code in src\Functions_Energy_Model.py
1143 1144 1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 | |
simulate_location_productivity(location, tilt_angle, azimuth)
Simulate the productivity of a PV plant with a capacity of 1 kWp in a given location with a fixed delta_t (the results are derated respect to a corrective parameter)
Parameters location : str, location of the PV plant tilt_angle : float, tilt angle of the PV plant azimuth : float, azimuth of the PV plant
Source code in src\Functions_Energy_Model.py
482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 | |
simulate_module_productivity(coordinates_dataset, tmys, module, tilt_angle, azimuth, inverter)
simulating the system under exam and calculating the results in different time interval (delta t, daily, monthly, yearly) Inputs: coordinates_dataset list of the parameters for each location under exam [list] tmys list of the meteorogical parameters for the locations under exam in a tmys [list] module module type and its parameters inverter inverter type and its parameters Outputs: result_ac_energies dictionary in which we save the results for each time iteration in (kWh) for 100 Wp photovoltaic generator [dict]
Source code in src\Functions_Energy_Model.py
971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 | |
simulate_resampled_productivity(result_ac_energies_1kWp)
resampling the time interval of the data and set it to 1 hour in different time interval (1 hour, daily, monthly) Inputs: result_ac_energies_1kWp_GSE dictionary in which we save the results for each time iteration in (kWh / delta t) with an yealy limitation based on the GSE/RSE report [dict] Outputs: result_ac_energies_resampled dictionary in which we save the results for each time iteration in (kWh / delta t) with resampled data based on the selected delta t [dict]
Source code in src\Functions_Energy_Model.py
1081 1082 1083 1084 1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126 1127 1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 | |
simulate_timestep_single_user()
the function calculates the energy flow for a single timestep (15min or 1h) for a single consumer or prosumer. If a PV system is present, its energy flow follows the following hierarchy: load -> battery -> grid. For the prosumers, the following variables are also calculated: - LCF: Load Cover Factor = Energy self-consumed / Energy consumed (tells us the % of consumed energy self-generated; higher means there is little dependency from the grid, as self-production is covering most of the demand) - SCF: Supply Cover Factor = Energy self-consumed / Energy produced (tells us the % of produced energy self-consumed; higher means there is little energy available for injection into the grid and sharing with CACER)
Inputs
user (global) ID of the user to be simulated t (global) the timestep of the simulation, defined outside this function
Outputs: result list with all results organized in the correct format
Source code in src\Functions_Energy_Model.py
140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 | |
simulate_unstacked_productivity(result_ac_energies_gens_derated)
calculating the productivity for each generator with different capacity and organizing data in an unstacked format (one column for each generators) in different time interval (1 hour, daily, monthly, yearly) Inputs: result_ac_energies_gens_derated dictionary in which we save the results for each time iteration in (kWh / delta t) considering an annual production derating [dict] Outputs: result_ac_energies_to_csv_df dataframe with results calculated for each timestep in (kWh / delta t) ready for the exportation in csv file [dataframe]
Source code in src\Functions_Energy_Model.py
1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 | |
suppress_printing(func, *args, **kwargs)
function to suppress the printing sections of a specified function
Source code in src\Functions_Energy_Model.py
1876 1877 1878 1879 1880 | |
suppress_printing_no_args(func)
Suppresses the printing sections of a specified function without arguments. This function takes a function as an argument and redirects the standard output to a StringIO object, effectively suppressing any print statements in the function. Parameters func : The function for which to suppress the printing sections. Returns func The function with printing sections suppressed.
Source code in src\Functions_Energy_Model.py
1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 | |
weather_data(coordinates_dataset)
calculating a tipical meteorogical year (tmys) for the selected locations from PVGIS via pvlib function "pvlib.iotools.get_pvgis_tmy", with timestep of 60 minutes. For more info: https://pvlib-python.readthedocs.io/en/latest/reference/generated/pvlib.iotools.get_pvgis_tmy.html
Inputs
coordinates_dataset list of the parameters for each location under exam [list]
Outputs: tmys list of the meteorogical parameters for the locations under exam in a tmys [list]
Source code in src\Functions_Energy_Model.py
873 874 875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 891 892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 | |
weather_data_15_min(coordinates_dataset)
Calculating a tipical meteorogical year (tmys) for the selected locations via pvlib function "pvlib.location.Location.get_clearsky", with timestep of 15 minutes For more info: https://pvlib-python.readthedocs.io/en/latest/_modules/pvlib/location.html#Location.get_clearsky Inputs: coordinates_dataset list of the parameters for each location under exam [list] Outputs: tmys list of the meteorogical parameters for the locations under exam in a tmys [list]
Source code in src\Functions_Energy_Model.py
927 928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 961 962 963 964 965 966 967 | |