Search code examples
pythonpython-3.xpvlib

Passing arguments to this function which uses pvmismatch: Why is this not working?


I am using a library called pvmismatch which measures the impact of imperfect shading on solar cells, which I think will soon be compatible with pvlib. I am not sure if this is a question related to python in general or just the library, but probably the former.

I would like to create a function which takes in a list of "shadings" which uses "setSuns" and also the indices of which cells are to be shaded. My code is below:

def shade_into_powers(shades_list = [], temperatures_list = [], cells_list = []):
    length_of_lists = len(shades_list)
    list_of_powers = []
    for i in range(0, length_of_lists):
        my_module_shaded.setSuns(Ee = shades_list[i], cells = cells_list[i])
        my_module_shaded.setTemps(Tc=temperatures_list[i], cells= cells_list[i])
        list_of_powers[i] = my_module_shaded.pvcells[i].Igen*max(my_module_shaded.pvcells[i].Vcell)
    return list_of_powers

I later tried to try out this function as below:

shadez = [0.43, 0.43, 0.43]
tempez = [88, 81, 77]
cellz = [30, 31, 32]
powers_listed = shade_into_powers(shadez, tempez, cellz)

The error I get is "object of type 'int' is not iterable". What am I doing wrong here?

All help appreciated.

The below is the TraceBack:

Traceback (most recent call last):
  File "/home/abed/.config/JetBrains/PyCharmCE2020.2/scratches/scratch_2.py", line 176, in <module>
    powers_listed = shade_into_powers(shadez, tempez, cellz)
  File "/home/abed/.config/JetBrains/PyCharmCE2020.2/scratches/scratch_2.py", line 168, in shade_into_powers
    my_module_shaded.setSuns(Ee = shades_list[i], cells = cells_list[i])
  File "/home/abed/.local/lib/python3.7/site-packages/pvmismatch/pvmismatch_lib/pvmodule.py", line 323, in setSuns
    cells_to_update = [self.pvcells[i] for i in cells]
TypeError: 'int' object is not iterable


Solution

  • Thank you for using PVmismatch. As @carcigenicate, says in their comment, the reason you are getting TypeError: 'int' object is not iterable is because the expected argument for cells in setSuns() is a list as documented in the API: enter image description here

    I think you are trying to set the irradiance & temperature for 3 cells in a module. If correct, you can do this in a single call to setSuns followed by a single call to setTemps. Also note that cell temperatures are Kelvin, not Celsius. Also note you can get the max cell temperatures by calling the NumPy max() function on the array of IV-curve powers, Pcell[cell_idx].

    >>> from pvmismatch import *
    
    >>> shadez = [0.43, 0.43, 0.43]
    >>> tempez = [88, 81, 77]
    >>> cellz = [30, 31, 32]
    
    >>> my_module_shaded = pvmodule.PVmodule()
    
    >>> my_module_shaded.Pmod.max()  # module max power
    321.2733629193704
    
    # power of cells 30, 31, & 32, same for all cells in module
    >>> [cellpower.max() for cellpower in my_module_shaded.Pcell[cellz]]
    [3.3466338806725577, 3.3466338806725577, 3.3466338806725577]
    
    >>> my_module_shaded.setSuns(Ee=shadez, cells=cellz)
    
    >>> my_module_shaded.Pmod.max()  # module max power, after irradiance change
    217.32753929640674
    
    # NOTE: cell temperature is in Kelvin, not Celsius!
    >>> tempez = [tc + 273.15 for tc in tempez]  # convert to Kelvin
    >>> my_module_shaded.setTemps(Tc=tempez, cells=cellz)
    
    >>> my_module_shaded.Pmod.max()  # module max power, after temperature change
    215.93464636002747
    
    # power of cells 30, 31, & 32, same for all cells in module
    >>> [cellpower.max() for cellpower in my_module_shaded.Pcell[cellz]]
    [1.0892289330819398, 1.1230533440517434, 1.1424662134689452]