Per-panel PV power / energy visualization (solaredge optimizer data)

Hi, could you post the code please?
Like this view a lot.

Thanks

I have a SolarEdge solar setup and currently have a bad optimizer/panel. I was trying to understand/adapt the examples above to create an automation to notify me when this happens as my solar company does not do this. I was unable to adapt the examples above but I was able to create an automation which checks whether the sensor.last_measurement date is within two days. This seems to work, but may get annoying since it’s triggered to run once each day. At least it will act as a reminder to submit a service request to my provider. Replace the list of sensor last measurement (which is provided by the SolarEdge Optimizers data integration) with yours (or if you know a better way to loop through them without naming each, do that). Replace notify.mobile_app_DEVICE with the mobile device you want the notification to go to.

- alias: "[Solar] Mobile app notify when optimizer measurement date isn't updating"
  description: ""
  trigger:
    - platform: time
      at: "05:00:00"
  action:
    - repeat:
        for_each:
          - sensor.last_measurement_1_0_1
          - sensor.last_measurement_1_0_10
          - sensor.last_measurement_1_0_11
          - sensor.last_measurement_1_0_12
          - sensor.last_measurement_1_0_13
          - sensor.last_measurement_1_0_14
          - sensor.last_measurement_1_0_15
          - sensor.last_measurement_1_0_16
          - sensor.last_measurement_1_0_17
          - sensor.last_measurement_1_0_18
          - sensor.last_measurement_1_0_19
          - sensor.last_measurement_1_0_2
          - sensor.last_measurement_1_0_20
          - sensor.last_measurement_1_0_21
          - sensor.last_measurement_1_0_22
          - sensor.last_measurement_1_0_23
          - sensor.last_measurement_1_0_24
          - sensor.last_measurement_1_0_25
          - sensor.last_measurement_1_0_26
          - sensor.last_measurement_1_0_27
          - sensor.last_measurement_1_0_28
          - sensor.last_measurement_1_0_29
          - sensor.last_measurement_1_0_3
          - sensor.last_measurement_1_0_30
          - sensor.last_measurement_1_0_31
          - sensor.last_measurement_1_0_32
          - sensor.last_measurement_1_0_33
          - sensor.last_measurement_1_0_34
          - sensor.last_measurement_1_0_35
          - sensor.last_measurement_1_0_36
        sequence:
          - condition: template
            value_template: "{{ ((as_timestamp(now()) - as_timestamp(states(repeat.item)))/86400) > 2 }}"
          - service: notify.mobile_app_DEVICE
            data:
              message: >
                {{ state_attr( repeat.item , 'friendly_name') }} last measurement was on: {{ states( repeat.item ) }}, over 2 days ago. Check MySolarEdge app to confirm.
              data: {}

I am doing making one with weather animations over the panels (e.g sun rays, rain etc (have finished animations for: cloudy, pouring, rainy, sunny, windy)):
image
image

The sun & moon also tracks across the sky based on the time.
Coded to look with both light and dark themes regardless of time of day.

The only 3rd party component here is card-mod.
The panels and background gradients that changes throughout the day are drawn purely with css, the weather uses animated SVG’s that I am composing myself.

Will post the code when I am done and link to it here.

4 Likes

Hi, I’d like to use this on my solar plan (in Dutch ;)) but I’m not able to find out what this jinja thing is. Can you please clearify for me?

Thanks,
Jonathan

the ā€˜jinja thing’ is a custom template saved in the custom_templates folder

you can search this community to find heaps of examples, and this is the release explaining the feature 2023.4: Custom template macros, and many more new entity dialogs! - Home Assistant

Cool, thanks! Couldn’t believe it was not possible to find this using Google.

got this in a DM today… from a complete unknown person to me

Good evening,

Would you be so kind to share the final code and other things needed to copy this in my solaredge PV system.

It looks great / awsome. I am Dutch BTW

Since i am a newby, is it possible to explain step by step what you did?

at first I figured this was a prank, but then I got a second one

Good evening,

Like you prog. code to show solaredge optimizers.
Would you be so kind of sharing the final code?

i am a newby, but admire your work.
Could you briefly explain what you did step by step (what card you use, what sensors, what binairies you made, etc)
of is it possible to make a hacs for this (or is this remark realy stupid)

I am Dutch BTW

Thank you for sharing

Linking to my posts above in this thread

this is as crazy impolite as it gets in here I guess… never seen anything like it before, and posting this to the public seemed the only way to make clear this is completely inappropriate. Even for the Dutch.

@MissyQ anything we can do to improve generic instructions for newbies this cant be done?

good morning everyone, recently owner of homeassistant, recently made solaredge photovoltaic system, already all integrated in HA.
I also wanted to do the integration optimizers, but I get stuck with official Solaredge site id / account / psw. I tried all the combinations (http my complete site, public site, site id code etc) but it always gives me an error :pensive:

Go to your solaredge phone app,go to your location icon.
In HA first colum type your ID numbers from solarapp, username:mail / password:your password

Hello Kris,

Newbie here, Ffoxxann, what a wonderful card you made.
Just finished a layout of Lange stefan (som bugs, but … time will see.

You mentioned that you would post this card. Is there any change to get a total copy of this (raw configuration)?

Thank you for this Wonderfull idea.

Have a nice Xmas

1 Like

Hello,
I just installed the integration myself for my new installation and I got the same issue as you. I’m not sure why but after I tried 3-4 times with the same credentials, at the end it went through. I confirm you need to use siteID, email and password

1 Like

Really like the look of this card with the weather animations. Did you complete it enough where you could provide a link?

I took the lazy man’s route and just used custom button cards with borders to represent my solar array. Admittedly it doesn’t look as fancy as those with graphical backgrounds, but it gets the job done and is all I really need.

type: custom:mod-card
style: |
  ha-card {
    font-family: "roboto";
    --primary-text-color: black;
    --secondary-text-color: black;
    font-weight: bold;
    font-size: 16px !important;
  }
card:
  type: conditional
  conditions:
    - condition: state
      entity: sensor.ecu_inverter_status
      state_not: unavailable
  card:
    type: vertical-stack
    title: LIVE SOLAR ARRAY PRODUCTION
    cards:
      - type: horizontal-stack
        cards:
          - type: custom:button-card
            entity: sensor.inverter_702000836649_power_ch_2
            show_name: false
            show_icon: false
            show_state: true
            styles:
              card:
                - border-radius: 0px
                - border: 2px solid grey
          - type: custom:button-card
            entity: sensor.inverter_702000836649_power_ch_1
            show_name: false
            show_icon: false
            show_state: true
            styles:
              card:
                - border-radius: 0px
                - border: 2px solid grey
          - type: custom:button-card
            entity: sensor.inverter_702000833555_power_ch_2
            show_name: false
            show_icon: false
            show_state: true
            styles:
              card:
                - border-radius: 0px
                - border: 2px solid grey
          - type: custom:button-card
            entity: sensor.inverter_702000833555_power_ch_1
            show_name: false
            show_icon: false
            show_state: true
            styles:
              card:
                - border-radius: 0px
                - border: 2px solid grey
          - type: custom:button-card
            entity: sensor.inverter_702000836648_power_ch_2
            show_name: false
            show_icon: false
            show_state: true
            styles:
              card:
                - border-radius: 0px
                - border: 2px solid grey
          - type: custom:button-card
            entity: sensor.inverter_702000836648_power_ch_1
            show_name: false
            show_icon: false
            show_state: true
            styles:
              card:
                - border-radius: 0px
                - border: 2px solid grey
      - type: horizontal-stack
        cards:
          - type: custom:button-card
            entity: input_text.text0
            show_name: false
            show_icon: false
            show_state: true
            styles:
              card:
                - background-color: rgba(0, 0, 0, 0)
                - box-shadow: none
                - border: none
          - type: custom:button-card
            entity: input_text.text0
            show_name: false
            show_icon: false
            show_state: true
            styles:
              card:
                - background-color: rgba(0, 0, 0, 0)
                - box-shadow: none
                - border: none
          - type: custom:button-card
            entity: sensor.inverter_702000836651_power_ch_2
            show_name: false
            show_icon: false
            show_state: true
            styles:
              card:
                - border-radius: 0px
                - border: 2px solid grey
          - type: custom:button-card
            entity: sensor.inverter_702000836650_power_ch_1
            show_name: false
            show_icon: false
            show_state: true
            styles:
              card:
                - border-radius: 0px
                - border: 2px solid grey
          - type: custom:button-card
            entity: sensor.inverter_702000836650_power_ch_2
            show_name: false
            show_icon: false
            show_state: true
            styles:
              card:
                - border-radius: 0px
                - border: 2px solid grey
          - type: custom:button-card
            entity: input_text.text0
            show_name: false
            show_icon: false
            show_state: true
            styles:
              card:
                - background-color: rgba(0, 0, 0, 0)
                - box-shadow: none
                - border: none
      - type: horizontal-stack
        cards:
          - type: custom:button-card
            entity: input_text.text0
            show_name: false
            show_icon: false
            show_state: true
            styles:
              card:
                - background-color: rgba(0, 0, 0, 0)
                - box-shadow: none
                - border: none
          - type: custom:button-card
            entity: sensor.inverter_702000836655_power_ch_2
            show_name: false
            show_icon: false
            show_state: true
            styles:
              card:
                - border-radius: 0px
                - border: 2px solid grey
          - type: custom:button-card
            entity: sensor.inverter_702000836655_power_ch_1
            show_name: false
            show_icon: false
            show_state: true
            styles:
              card:
                - border-radius: 0px
                - border: 2px solid grey
          - type: custom:button-card
            entity: sensor.inverter_702000833551_power_ch_1
            show_name: false
            show_icon: false
            show_state: true
            styles:
              card:
                - border-radius: 0px
                - border: 2px solid grey
          - type: custom:button-card
            entity: sensor.inverter_702000833551_power_ch_2
            show_name: false
            show_icon: false
            show_state: true
            styles:
              card:
                - border-radius: 0px
                - border: 2px solid grey
          - type: custom:button-card
            entity: input_text.text0
            show_name: false
            show_icon: false
            show_state: true
            styles:
              card:
                - background-color: rgba(0, 0, 0, 0)
                - box-shadow: none
                - border: none

2 Likes

I love this post. I don’t have SolarEdge, but I’m building off of this for my Enphase based system. I want to understand the math you’re using to translate to my system:

Math.round(Number(entity.state)) / 250 + 0.2

Is 250 what your panel max output is? What’s the addition of another 20% on top of the entity state? I’m pretty sure the extra 20% is make sure the panel is completely blacked out when it’s not producing or producing very little, but just verifying.

Thanks for such a great dashboard and starting such a productive discussion here!

Just some numbers I played with to make the colors look good, and to have some contrast so it became easier to compare off vs on panels. I recommend testing your panels at 100% and 0% and just see how it looks on your dashboard.

1 Like

Hi, Has anyone found a reliable way to tell if the optimizer is down?

you could do a basic outlier detection. So compare the current value against the rolling average, normalized to irradiance. And on top of that compare the current value against the rest of the array in the same orientation.

See: Anomaly detection - Wikipedia

Hi, how did you get the daily values?
It only gives me instantaneous values and lifetime values.