Advertisement
If you have a new account but are having problems posting or verifying your account, please email us on hello@boards.ie for help. Thanks :)
Hello all! Please ensure that you are posting a new thread or question in the appropriate forum. The Feedback forum is overwhelmed with questions that are having to be moved elsewhere. If you need help to verify your account contact hello@boards.ie

Solar PV Monitoring/Automation Thread

Options
1272830323370

Comments

  • Registered Users Posts: 14,900 ✭✭✭✭Ha Long Bay


    Thanks again for all your help. I will check them settings first on the inverter tomorrow and set to what you suggested and test.

    Completely agree on the plans every situation and use case is different. When I compared plans it was the same price on the standard smart tariff without the free Saturday or Sunday from BGE with unit rate and standing charge so want to try and utilize it as best I can.



  • Registered Users Posts: 14,900 ✭✭✭✭Ha Long Bay


    So just an update checked the inverter settings and it was set to discharge so that I think explains why the eddi started taking the excess during the test.



    I have made the changes suggested and disabled discharge now.



    I think that should be everything setup now. Thanks again @connesha for your time and patience.



  • Registered Users Posts: 189 ✭✭connesha


    👍

    The charge limit should be approx 18.7A in that second image, for your 10kwh battery.

    (9.4 would be for a 5kwh battery)



  • Registered Users Posts: 427 ✭✭Geeyfds53573


    I went with BG dual fuel as the gas price is what decides it for me but am only on a standard tariff. Wasn’t offered near the same deal for the 2-5 smart plan. I did feel if I upgraded my battery from 10 to 20Kwh the 2-5 might make financial sense but I would need I guess a second inverter or how would you boost the amount you can get into a battery in 3 hrs. 100A continuous for 3hrs would be needed to fill 20Kwh? What do you get into the battery in that timeframe @connesha



  • Registered Users Posts: 14,900 ✭✭✭✭Ha Long Bay


    Thanks good spot I have updated the values now. The attic ladder has paid for itself already.



  • Advertisement
  • Registered Users Posts: 189 ✭✭connesha


    I've not yet had to fill the bigger battery at night, given the good solar generation this time of year, and there being enough leftover after a good day to more than cover a bad day. But, calculations say a Solis Inverter will put in approx 11.5kWh during 3 hours, given the derating to 70A after 15 mins.

    Even in a bad day, this'll cover a days usage (ours at least), for the vast majority the time.

    11.5kwh charge + yesterdays leftovers in battery + todays (poor) generation

    Especially considering automation to boost immersion between 2-5AM when the forecast is very bad, and can set dishwasher/washing machine to run between 2-5am too. This takes care of 3 of the biggest consumers.

    Would be hard to see the justification for a second inverter, given you already have a nice setup (unless your usage is very high?). You have 10kwh CALB cells, with Seplos BMS, right? Maybe just doubling it to a 16s2p? (buy more cells and keep the single BMS) So, especially if you have a large array, you'll find it easier to cover the bad days if you get some good-ish days thrown in the middle.



  • Registered Users Posts: 189 ✭✭connesha


    Looking forward to seeing it in action next Saturday! 😉



  • Registered Users Posts: 427 ✭✭Geeyfds53573


    Thanks @connesha - yea spot on I had plans of doubling up to 20Kwh as usage has increased but would really need to be filling it in the 3 hr window to make it worthwhile. The cost would need to be looked at as I guess the 20Kwh would roughly be the max you could get maybe some hot water but you wouldn’t charge the car.



  • Registered Users Posts: 2,279 ✭✭✭SD_DRACULA


    You can't fill it in that window.

    If you have a Solis 5G hybrid it drops the charge/discharge from 100a to 70a after 15 mins, so at best you're looking at around 10kwh in 3 hours.

    Solis lied to us, again.



  • Registered Users Posts: 189 ✭✭connesha


    It is possible quite easily to do a good bit with the 3 hours, if have the devices to take advantage of it (and the Eddi/Zappi are great devices for this).

    For instance, looking at it relatively conservatively, taking voltage as 220V, with a 65A main fuse (and have set the Eddi/Zappi grid limit to 60A), you could plan to consume some 35kwh to 40kwh during the period. This wouldn't be any inconvenience (at least it isn't for us), as half of it is done via automations that you never have to touch, and have to turn on the dishwasher anyway, so just as easy to set the time when doing so.

    Rough numbers for illustration (not labouring on losses, as they are rough calcs):

    • Automation to charge Battery for 3 hours at 70A (on a bad forecast day): 11kwh (in reality may consume a little more)
    • Time Dishwasher to start at 2AM: 1.5kwh
    • Time Washing Machine to start at 3AM: 1.5kwh
    • Time/Automate Eddi to boost at 4AM for 1 hour: 3kwh *
    • Time/Automate Zappi to Boost for full period: approx 20kwh **
    • Base load / few other smaller load devices automated to come on, like dehumidifier, etc: 1kw


    * Eddi:

    • in our case, the automation kicks in at 4 AM, it then calculates how much it wants to put in, and then delays as necessary. For instance, if it decides it wants to put in only 2kwh, it'll Delay for 20 mins, then Boost for 40 mins

    **Zappi:

    • I don't have a Zappi, so I'm assuming (hoping!) that you can boost both Eddi and Zappi at the same time, and the lower priority one will throttle based on Grid Limit.
    • 20kwh is a rounded number, maybe it'll be 19kwh or 18kwh, depending on your other devices. (This is based on 7.4kw rate, that will get throttled a little during the cycle to keep under the Grid Limit)
    • The other device start times are staggered to minimise overlap (many of these longer running devices often have higher consumption towards the earlier part of the cycle), so as to minimise how much the Zappi has to throttle when other devices heating cycles kick in


    So, you could still be looking at 100km plus of range added to the EV every night, with no real inconvenience (even if only getting in 17kwh @ 6km/kwh)



  • Advertisement
  • Registered Users Posts: 258 ✭✭S'


    I am looking to heat my hot water cylinder on night rate using the eddi.

    Do I need a myenergi hub to trigger the Eddi via HA?

    11.2kWp E/W split arra. Mayo



  • Registered Users Posts: 189 ✭✭connesha




  • Registered Users Posts: 2,505 ✭✭✭bullit_dodger


    "I am looking to heat my hot water cylinder on night rate using the eddi."

    Why not just simply set a timer, then that's possible with the older model too....




  • Registered Users Posts: 258 ✭✭S'


    I was thinking about going that route but I have a solid fuel stove connected to the cylinder and won’t need the boost timer activated if the cylinder is up to temperature.

    11.2kWp E/W split arra. Mayo



  • Moderators, Science, Health & Environment Moderators Posts: 4,696 Mod ✭✭✭✭Tree


    If it's at temperature, the eddi will just go "max temp reached" and won't heat during the boost time. The hub is handy if you want to schedule depending on tomorrow's forecast, but if you're running it anyway the timer should be enough.



  • Registered Users Posts: 427 ✭✭Geeyfds53573


    Yep I saw your original post on that @SD_DRACULA a big thank you as I was on the older version Solis and was planning to upgrade for the 100A but that’s not possible so glad I didn’t. My plan was to add a second inverter to achieve the 20Kwh in the 3 hr window but as connesha shows I should really think about it apart from cost I would need some Eddi/Zappi usage in the 3 hrs and this probably means my 20Kwh needs would be reduced a bit so financially not worth it. @connesha thank you worth thinking about fyi Eddi/Zappi work in conjunction as you described.



  • Moderators, Education Moderators, Home & Garden Moderators Posts: 8,145 Mod ✭✭✭✭Jonathan



    If you don't have any temperature sensors on the cylinder, this is likely your only option. The downside is that you're probably heating more water than you need if you have the immersion stat set to 60°C. Outside of the weekly Legionella cycle, 50°C is likely more than sufficient.

    I'm in a similar position with both Solar Thermal and and Eddi feeding my cylinder. There is usually sufficient water for the morning showers, but after a particularly dull day, the cylinder needs a needs to be boosted by a kWh or two. I've set up a HA automation to look after this. It uses the MyEnergi HA integration that @connesha linked to above, together with three cylinder temperature sensors from my Solar Thermal controller (at the top, middle and bottom of the cylinder). The other point to note is that my immersion is at the side of the cylinder, about 1/2 way down, just below middle temperature sensor.

    In summary:

    • At 04:30, check if it is a weekday AND the middle of the cylinder is below 50°C AND the bottom of the cylinder is below 40°C
    • Turn on the Eddi
    • Start a boost for 60 minutes
    • Check every minute if the middle of the cylinder has reached 50°C yet
    • Stop the boost (Start a new boost for 0 minutes)
    • Turn off the Eddi
    alias: "Eddi: Daily Hot Water Boost"
    description: ""
    trigger:
     - platform: time
       at: "04:30:00"
    condition:
     - condition: time
       weekday:
         - mon
         - tue
         - wed
         - thu
         - fri
     - condition: numeric_state
       entity_id: sensor.resol_tankmiddletemp
       below: 50
     - condition: numeric_state
       entity_id: sensor.resol_tankbottomtemp
       below: 40
    action:
     - device_id: <EDDI DEVICE ID>
       domain: select
       entity_id: select.myenergi_eddi_operating_mode
       type: select_option
       option: Normal
     - service: myenergi.myenergi_eddi_boost
       data:
         target: Heater 1
         time: 60
       target:
         device_id: <EDDI DEVICE ID>
     - repeat:
         while:
           - condition: numeric_state
             entity_id: sensor.resol_tankmiddletemp
             below: 50
         sequence:
           - delay:
               hours: 0
               minutes: 1
               seconds: 0
               milliseconds: 0
     - service: myenergi.myenergi_eddi_boost
       data:
         target: Heater 1
         time: 0
       target:
         device_id: <EDDI DEVICE ID>
     - device_id: <EDDI DEVICE ID>
       domain: select
       entity_id: select.myenergi_eddi_operating_mode
       type: select_option
       option: Stopped
    mode: single
    


  • Registered Users Posts: 1,440 ✭✭✭DC999


    Really good post. And it's really about how people can load shift. So great for those like me who are new to it all.

    The 3 hour window is secondary in a way.

    As is the automation. I don't have a clue about automation yet. Tis ninja stuff for me now. Hopefully I will in time. And this thread shows me the power of it.

    Me and apps on a very few apps on my phone are the 'automation' for now. Check the standard Met Eireann forecast for tomorrow. Don't look at solar radiation per hour. Just if it shows sun in the hourly pics :) That gives a very crude estimate of output the next day.

    Then check the charge on the EV. Decide how long to leave the scheduled nightly Zappi charge run to get to X% for the morning.

    Set the dishwasher to run at night on a 7 euro smart plug. In fact I have it set to finishnow for when we get down for breakkie as heats the kitchen.

    So people can still benefit themselves on lower cost oer unit and help emmisions from the grid by load shifting manually. Tis all a journey!

    What I typed above took me longer than it does per night.



  • Registered Users Posts: 700 ✭✭✭fuse


    Been tracking the forecasts from meteireann & solcast the last few days. Not bad!

    arrayMultiplier = 0.187*27.3/1000        # panelEfficiency * panelArea(m2) = 1.95*14 / 1000 (to kWh)



  • Moderators, Education Moderators, Home & Garden Moderators Posts: 8,145 Mod ✭✭✭✭Jonathan


    I've made some more progress on this this evening. Using pysolar, I'm calculating the angle of incidence (angle of the sun relative to the array) for each hour, and using the cosine of this (in the range of 0 to 1 for those that have forgotten their Leaving Cert Maths) as a crude correction coefficient. This correction coefficient is then used as a multiplier against the corresponding globalIrrediance value from MetEireann. There are other ways to calculate too, using the angle of incidence and the refractive index between air and glass (Snell's Law), but that is a bit more complicated to calculate.


    Comparison below for raw W/m^2 values from Met for my location, and the corrected values for N/S/E/W arrays at 30° tilt. I'll give this a go for a few days and see how it turns out.

    The drop off in radiation around lunchtime hits the S facing array badly, and would be surpassed by an E/W array.



  • Advertisement
  • Registered Users Posts: 1,081 ✭✭✭silver_sky


    My Met Éireann forecast has been failing miserably the past few days. I hit 67% on 25th, 78% on 26th, and just 50% on the 27th... :(



  • Registered Users Posts: 189 ✭✭connesha


    @Jonathan, RE: "angle of incidence ... for each hour .. using the cosine..."

    There is a class in my implementation that may help. You should be able to take directly and it'll give you the actual Sun Angle, for any datetime. If you want to go that way, call it each time with any hour you need.

    See the implementation of SunAngles.zen_angle_at_date(date_time, location), here: https://github.com/connesha/home-energy-mgr-ext-main/blob/master/utils/sun_angles.py

    Call it as follows, to get the angle of the sun, for the given datetime, in degrees:

    location = EarthLocation.from_geodetic(self.longitude, self.latitude)
    zen_angle = zen_angle_at_date(date_time, location)
    




  • Moderators, Home & Garden Moderators Posts: 5,974 Mod ✭✭✭✭graememk


    That's great work. I started to dabble with it but got distracted.

    Gotta love 12am coding!

    Do we need to take the height of the sun into account too?



  • Registered Users Posts: 189 ✭✭connesha


    Yea, this gives you the height of the sun in degrees. For example, now returns 61.7 deg. At solar-noon today it'll give 55.7 deg. And at sunset it'll be close to 90deg.



  • Moderators, Home & Garden Moderators Posts: 5,974 Mod ✭✭✭✭graememk


    Ah ok! Sweet! What happens when it goes below the horizon? Does it start at 90 in the morning?

    So when the sun is at.. 60 and your panels are at 60° (very steep I know) the panels are square on. This should boost the w/m2 value as I am thinking that the met data is assuming a m2 on the ground flat?

    So, azimuth is the position of the sun, ,(N/S/E/W) and elevation is the height angle.

    I need to start playing with this.

    @Jonathan been a while since I done trig, and haven't got a chance to look at your code, but how are you calculating the angle of incidence?

    Does the angle of the panels matter if the elevation isn't taken into account, only direction?



  • Registered Users Posts: 189 ✭✭connesha


    Yea, exactly, at night it'll go over 90deg. For example, if set a time of 10pm tonight, it'll give 122deg.

    (just watch out for DST/UTC; that using the same everywhere... that can get tedious...)



  • Registered Users Posts: 2,505 ✭✭✭bullit_dodger


    I looked at doing it this way (angles,etc) last year when myself and connesha were chatting over in the other thread, but surprisingly it doesn't give as good results as working out a moving average of the actuals compared to the forecasts. I may have an error in my math of course, but it wasn't aligning for me. It was further complicated by the fact that I have a 1.3Kwp east and 3.8Kwp west, so if the clouds rolled in 2 hrs later, the angles would have changes significantly skewing my results. Better to go the moving averages way.

    Why? Well, what you're actually doing with (say) a 10pt moving average of the actuals verses forecast is computing that "0.18" figure that Jonathan was using in his original method. This 0.18 "power factor" (for lack of a better word) will vary depending

    • time of year
    • type of panels installed (some are better at diffuse light than others)
    • Orientation etc

    When I did it I found that looking up and computing a 10pt moving average of the forecasts correlates nicely to the actuals , e.g.

    and then using the 10 pt moving average of actual to forecast, I can say that for every 1000 in Met Eireann solar I get ~4Kwhr in production. Sometimes of the year it's 3.8, other times in the year it's 4.1-4.2Kwhr/1000. Course this "3.8" number will vary from installation to installation, depedning on the number of panels, orientation etc.

    (It's also a lot easier to do it this way than with angles - but that's neither here/there as it's fun to do the math.... just saying)



  • Registered Users Posts: 189 ✭✭connesha


    You could do the hourly forecast A LOT simper for many setups, ... and TBH it'll probably be just as accurate as any complex angle/azimuth calculations (given all of this is a forecast anyways, so "close" is a very good result).

    I'm doing the following and its pretty close. Its on an equal east-west setup, with a tiny bit of late evening shading (more complex/less symmetrical roofs/angles/shading may be different)

    • Calculate your daily generation by multiplying the "factor" by the daily radiation (where the factor can be hardcoded, or "learning" day-by-day)
    • Take your hourly generation as: hourly-radiation * this same factor

    Super easy as a first version, and see how it goes for you...

    I just spot checked 2 days in the past 2 weeks. 1 sunny day (30kwh generated), and 1 cloudy day (11kwh generated), and the cumulative hourly forecast was within 1.3kwh of being accurate through the day, and each individual hour was less than that

    (remember to shift left/right by an hour for UTC if necessary, depending on what time you're using)



  • Registered Users Posts: 2,505 ✭✭✭bullit_dodger


    Same method as connesha mentions above.

    Some days it's out a bit, but that's more that the forecast didn't play out in reality as opposed to the math was incorrect, but the general trends are as you can see pretty good for deciding things like battery charging levels.



  • Advertisement
  • Moderators, Education Moderators, Home & Garden Moderators Posts: 8,145 Mod ✭✭✭✭Jonathan


    To calculate the angle of incidence, you need the height and azimuth of the sun, as well as the slope and orientation of the array. See sample code below. Even using pysolar, the calculation is ugly.

    from pysolar import solar, solartime, constants, elevation
    import datetime
    import math
    import warnings
    
    # Suppress warnings about missing 2022 leap seconds in pysolar package from PyPI
    warnings.filterwarnings("ignore", message="I don't know about leap seconds after")
    
    # Use 00:30 on current date as epoch
    epoch = dt = datetime.datetime.now().replace(
       hour=0, minute=30, second=0, microsecond=0, tzinfo=datetime.timezone.utc
    )
    
    # Build list of 24 timestamps, 00:30 through 23:30
    date_list = [epoch + datetime.timedelta(hours=x) for x in range(24)]
    
    latitude = 53.3473
    longitude = -6.2591
    height = 20.0 # meters (above sea level)
    slope = 30.0 # degrees (array slope)
    orientation = 0.0 # degrees(array orientation, +ve = west from south, -ve = east from south, 0 = due south)
    
    for date in date_list:
       altitude, azimuth = solar.get_position(latitude, longitude, date)
       jd = solartime.get_julian_solar_day(date)
       jde = solartime.get_julian_ephemeris_day(date)
       jce = solartime.get_julian_ephemeris_century(jde)
       jme = solartime.get_julian_ephemeris_millennium(jce)
       geocentric_longitude = solar.get_geocentric_longitude(jme)
       geocentric_latitude = solar.get_geocentric_latitude(jme)
       nutation = solar.get_nutation(jce)
       sun_earth_distance = solar.get_sun_earth_distance(jme)
       true_ecliptic_obliquity = solar.get_true_ecliptic_obliquity(jme, nutation)
       aberration_correction = solar.get_aberration_correction(sun_earth_distance)
       apparent_sun_longitude = solar.get_apparent_sun_longitude(
           geocentric_longitude, nutation, aberration_correction
       )
       apparent_sidereal_time = solar.get_apparent_sidereal_time(jd, jme, nutation)
       geocentric_sun_right_ascension = solar.get_geocentric_sun_right_ascension(
           apparent_sun_longitude, true_ecliptic_obliquity, geocentric_latitude
       )
       geocentric_sun_declination = solar.get_geocentric_sun_declination(
           apparent_sun_longitude, true_ecliptic_obliquity, geocentric_latitude
       )
       local_hour_angle = solar.get_local_hour_angle(
           apparent_sidereal_time, longitude, geocentric_sun_right_ascension
       )
       equatorial_horizontal_parallax = solar.get_equatorial_horizontal_parallax(
           sun_earth_distance
       )
       projected_radial_distance = solar.get_projected_radial_distance(height, latitude)
       projected_axial_distance = solar.get_projected_axial_distance(height, latitude)
       parallax_sun_right_ascension = solar.get_parallax_sun_right_ascension(
           projected_radial_distance,
           equatorial_horizontal_parallax,
           local_hour_angle,
           geocentric_sun_declination,
       )
       topocentric_sun_declination = solar.get_topocentric_sun_declination(
           geocentric_sun_declination,
           projected_axial_distance,
           equatorial_horizontal_parallax,
           parallax_sun_right_ascension,
           local_hour_angle,
       )
       topocentric_local_hour_angle = solar.get_topocentric_local_hour_angle(
           local_hour_angle, parallax_sun_right_ascension
       )
       pressure = elevation.get_pressure_with_elevation(height)
       temperature = elevation.get_temperature_with_elevation(height)
       topocentric_zenith_angle = solar.get_topocentric_zenith_angle(
           latitude,
           topocentric_sun_declination,
           topocentric_local_hour_angle,
           pressure,
           temperature,
       )
       topocentric_azimuth_angle = solar.get_topocentric_azimuth_angle(
           topocentric_local_hour_angle, latitude, topocentric_sun_declination
       )
       incidence_angle = solar.get_incidence_angle(
           topocentric_zenith_angle, slope, orientation, topocentric_azimuth_angle
       )
       print(
           "time ", date, "\n",
           "altitude ", altitude, "\n",
           "azimuth ", azimuth, "\n",
           "incidence_angle ", incidence_angle, "\n",
           "cos(incidence_angle) ", math.cos(math.radians(incidence_angle)), "\n",
           sep="",
       )
    


    Thanks for this. I missed it, but from a quick glance, I don't think it has enough detail to calculate the AOI? I think your array with the shallow angle is a bit of an exception. I would have thought that the steeper the angle, the more important the hourly forecast becomes as compared to the daily total figure.

    As regards the timestamps, the Met forecast is currently in Zulu time, so easiest to do everything in UTC.



Advertisement