Skip to content
View in the app

A better way to browse. Learn more.

Power Forum - Renewable Energy Discussion

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

SunSynk Logger Integration into Home Assistant

Featured Replies

I do not have any data under my input_2 sensor so without a screenshot for reference to confirm my suspicion this is just a shot in the dark but if the sensor follow the pattern I'm seeing perhaps this should resemeble what you would need.🤷‍♂️

####These templates are needed for the Sunsynk Power Flow Card https://github.com/slipx06/sunsynk-power-flow-card
####Solar Sensors
####solarday_108: sensor.sunsynk_daily_pv_108
####pv1_power_186: sensor.sunsynk_pv1_186
####pv2_power_187: sensor.sunsynk_pv1_187
####pv3_power_188: sensor.sunsynk_pv1_188
####pv4_power_189: none
####pv1_v_109: sensor.sunsynk_pv1_voltage_109
####pv1_i_110: sensor.sunsynk_pv1_current_110
####pv2_v_111: sensor.sunsynk_pv2_voltage_111
####pv2_i_112: sensor.sunsynk_pv2_current_112
####pv3_v_113: sensor.sunsynk_pv3_voltage_113
####pv3_i_114: sensor.sunsynk_pv3_current_114
####pv4_v_115: none
####pv4_i_116: none

  - sensor:
      - name: "Sunsynk Daily PV 108"
        state: >
          {{state_attr('sensor.sunsynk_input', 'etoday')|float(0)|round(1)}}
  - sensor:
      - name: "Sunsynk PV1 186"
        state: >
          {{state_attr('sensor.sunsynk_input', 'pv1')|float(0)|round(0)}}
  - sensor:
      - name: "Sunsynk PV2 187"
        state: >
          {{state_attr('sensor.sunsynk_input', 'pv2')|float(0)|round(0)}}
  - sensor:
      - name: "Sunsynk PV3 188"
        state: >
          {{state_attr('sensor.sunsynk_input_2', 'pv3')|float(0)|round(0)}}
  - sensor:
      - name: "Sunsynk PV1 Voltage 109"
        state: >
          {{state_attr('sensor.sunsynk_input', 'pvIV_0_vpv')|float(0)|round(1)}}
  - sensor:
      - name: "Sunsynk PV1 Current 110"
        state: >
          {{state_attr('sensor.sunsynk_input', 'pvIV_0_ipv')|float(0)|round(1)}}
  - sensor:
      - name: "Sunsynk PV2 Voltage 111"
        state: >
          {{state_attr('sensor.sunsynk_input', 'pvIV_1_vpv')|float(0)|round(1)}}
  - sensor:
      - name: "Sunsynk PV2 Current 112"
        state: >
          {{state_attr('sensor.sunsynk_input', 'pvIV_1_ipv')|float(0)|round(1)}}
  - sensor:
      - name: "Sunsynk PV3 Voltage 113"
        state: >
          {{state_attr('sensor.sunsynk_input_2', 'pvIV_3_vpv')|float(0)|round(1)}}
  - sensor:
      - name: "Sunsynk PV3 Current 114"
        state: >
          {{state_attr('sensor.sunsynk_input_2', 'pvIV_3_ipv')|float(0)|round(1)}}

 

Edited by -cK-
typo

  • Replies 948
  • Views 131.8k
  • Created
  • Last Reply

Top Posters In This Topic

Most Popular Posts

  • randomfool
    randomfool

    I am making good progress on converting slip06x excellent dashboard to work with Gary's brilliant work on gathering the data from the latest Sunsynk inverters remotely. Will publish the dashboard

  • @Gary Waterworth   Did a quick YouTube video on how to install your software and to get the data into HASS, no cards or anything so very basic.  Please let me know what you guys think of my first

  • randomfool
    randomfool

    Ok here goes; caveats to begin with - I am no HA expert, in fact I only discovered HA a few weeks ago through Gary's post and his subsequent links to slip06x dashboard, so my ability to provide "suppo

Posted Images

On 2023/05/31 at 11:31 PM, -cK- said:

@slipx Think I've got all the major bugs ironed out so here is the code for that add-on:

Template sensors needed in the configuration file:

#####
#####
##### Sunsynk-Power-Flow-Card: Add-On
##### Markdown Sensors Template
#####
#####

      battery_cap:
        friendly_name: "Battery Capacity"
        value_template: >
          {% set grid_online = states('sensor.sunsynk_grid_online') | float %}
          {% if grid_online | float == 0 %}
            {{ (states.sensor.sunsynk_settings.attributes.batteryShutdownCap) | float }}
          {% else %}
            {% set now = strptime(as_timestamp(now()) | timestamp_custom('%H:%M'), '%H:%M') %}
            {% set sellTime1 = strptime(state_attr('sensor.sunsynk_settings', 'sellTime1'), '%H:%M') %}
            {% set sellTime2 = strptime(state_attr('sensor.sunsynk_settings', 'sellTime2'), '%H:%M') %}
            {% set sellTime3 = strptime(state_attr('sensor.sunsynk_settings', 'sellTime3'), '%H:%M') %}
            {% set sellTime4 = strptime(state_attr('sensor.sunsynk_settings', 'sellTime4'), '%H:%M') %}
            {% set sellTime5 = strptime(state_attr('sensor.sunsynk_settings', 'sellTime5'), '%H:%M') %}
            {% set sellTime6 = strptime(state_attr('sensor.sunsynk_settings', 'sellTime6'), '%H:%M') %}
            {% if now >= sellTime1 and now < sellTime2 %}
              {{ state_attr('sensor.sunsynk_settings', 'cap1') | float }}
            {% elif now >= sellTime2 and now < sellTime3 %}
              {{ state_attr('sensor.sunsynk_settings', 'cap2') | float }}
            {% elif now >= sellTime3 and now < sellTime4 %}
              {{ state_attr('sensor.sunsynk_settings', 'cap3') | float }}
            {% elif now >= sellTime4 and now < sellTime5 %}
              {{ state_attr('sensor.sunsynk_settings', 'cap4') | float }}
            {% elif now >= sellTime5 and now < sellTime6 %}
              {{ state_attr('sensor.sunsynk_settings', 'cap5') | float }}
            {% elif now >= sellTime6 or now < sellTime1 %}
              {{ state_attr('sensor.sunsynk_settings', 'cap6') | float }}
            {% else %}
              {{ (states.sensor.sunsynk_settings.attributes.batteryShutdownCap) | float }}
            {% endif %}
          {% endif %}
      soc_battery_time_left:
        friendly_name: "Battery Depletion Seconds"
        unit_of_measurement: Seconds
        value_template: >
          {% set state = states('sensor.sunsynk_battery_power') | int %}
          {% set cap = states('sensor.battery_cap') | float %}
          {% if state == 0 %}
            {{ ((((states('sensor.sunsynk_battery_soc') | float - cap) / 100) * 10240) / 1 * 60 * 60) | int }}
          {% else %}
            {{ ((((states('sensor.sunsynk_battery_soc') | float - cap) / 100) * 10240) / (states('sensor.sunsynk_battery_power') | float) * 60 * 60) | int }}
          {% endif %}
      soc_battery_time_left_friendly:
        friendly_name: "Battery Depletion Time"
        value_template: >
          {% set state = states('sensor.sunsynk_battery_power') | int %}
          {% if state > 0 -%}
           {%- set time = states('sensor.soc_battery_time_left') | int %}
           {%- set minutes = ((time % 3600) // 60) %}
           {%- set minutes = '{} min'.format(minutes) if minutes > 0 else '' %}
           {%- set hours = ((time % 86400) // 3600) %}
           {%- set hours = '{} hrs, '.format(hours) if hours > 0 else '' %}
           {%- set days = (time // 86400) %}
           {%- set days = '{} day, '.format(days) if days > 0 else '' %}
           {{ 'Floating' if time < 60 else days + hours + minutes }}
          {%- else -%}
           {{ 'Charging' }}
          {%- endif %}
      battery_charging_time_left:
        friendly_name: "Battery Charging Time Left"
        unit_of_measurement: Seconds
        value_template: >
          {% set power = states('sensor.sunsynk_battery_power') | float %}
          {% set soc = states('sensor.sunsynk_battery_soc') | float %}
          {% set cap = states('sensor.battery_cap') | float %}

          {% if power < 0 %}
            {% if soc < cap %}
              {{ ((((cap - soc) / 100) * 10240) / (-power) * 60 * 60) | int }}
            {% else %}
              {{ ((((100 - soc) / 100) * 10240) / (-power) * 60 * 60) | int }}
            {% endif %}
          {% else %}
            0
          {% endif %}
      battery_charging_time_left_friendly:
        friendly_name: "Battery Charging Time"
        value_template: >
          {% set state = states('sensor.sunsynk_battery_power') | int %}
          {% if state < 0 -%}
           {%- set time = states('sensor.battery_charging_time_left') | int %}
           {%- set minutes = ((time % 3600) // 60) %}
           {%- set minutes = '{} min'.format(minutes) if minutes > 0 else '' %}
           {%- set hours = ((time % 86400) // 3600) %}
           {%- set hours = '{} hrs, '.format(hours) if hours > 0 else '' %}
           {%- set days = (time // 86400) %}
           {%- set days = '{} day, '.format(days) if days > 0 else '' %}
           {{ 'Floating' if time < 60 else days + hours + minutes }}
          {%- else -%}
           {{ 'Discharging' }}
          {%- endif %}
      markdown_battery_charge_time_left:
        friendly_name: "Markdown Battery Charging Time"
        value_template: >
          {% if states('sensor.sunsynk_battery_soc') | float < states('sensor.battery_cap') | float %}
           {{ states('sensor.battery_cap') | float | round(0) }}
          {% else %}
           100
           {% endif %}
      markdown_discharge_time:
        friendly_name: "Markdown Discharge Time"
        value_template: >
          {% set now = as_timestamp(now()) %}
          {% set add = states('sensor.soc_battery_time_left') | int %}
          {% set future_time = now + add %}
           {{ future_time | timestamp_custom('%H:%M') }}
      markdown_charge_time:
        friendly_name: "Markdown Charging Time"
        value_template: >
          {% set now = as_timestamp(now()) %}
          {% set add = states('sensor.battery_charging_time_left') | int %}
          {% set future_time = now + add %}
           {{ future_time | timestamp_custom('%H:%M') }}
      battery_status:
        value_template: "{{ 'positive' if states('sensor.sunsynk_battery_power')|float > 0 else 'negative' }}"
        friendly_name: "Battery Status"

10240 is the battery size (2x5.12kW batteries so adjust this value accordingly to your setup) 

Then I have the different markdown cards setup as conditional cards below the Sunsynk Power Flow Card:

  - type: conditional
    conditions:
      - entity: sensor.battery_status
        state: positive
    card:
      type: markdown
      content: "<table width=\"100%\"  border=0>\n  <tbody> \n  <tr>\n    <td align=\"center\">\n    <b>Discharge to {{ states('sensor.battery_cap') | float | round(0)}}% :\n   {{ states('sensor.soc_battery_time_left_friendly') }} @ {{  states('sensor.markdown_discharge_time') }}</b> \n  \t</td>\n  </tr>\n  </tbody>\n</table>"
  - type: conditional
    conditions:
      - entity: sensor.battery_status
        state: negative
    card:
      type: markdown
      content: "<table width=\"100%\"  border=0>\n  <tbody> \n  <tr>\n    <td align=\"center\">\n    <b>Charge to {{ states('sensor.markdown_battery_charge_time_left') | float | round(0)}}% : \n   {{ states('sensor.battery_charging_time_left_friendly') }} @ {{  states('sensor.markdown_charge_time') }}</b> \n  \t</td>\n  </tr>\n  </tbody>\n</table>"
  - type: conditional
    conditions:
      - entity: sensor.battery_status
        state: unavailable
    card:
      type: markdown
      content: "<table width=\"100%\"  border=0>\n  <tbody> \n  <tr>\n    <td align=\"center\">\n    <b>Houston, we have a Problem</b> \n  \t</td>\n  </tr>\n  </tbody>\n</table>\n"

Think that is everything needed for this add-on to work.  Note that I'm using Gary's integration to pull the inverter data so not sure what the sensors would be on the other integrations like Solarman etc. sorry.

image.png.a214b002f64bddfa1e2581242722c414.png

image.png.cf24c5235426810f6ebc15f661b7820d.png

Busy testing. I think we can create an input sensor for the battery capacity. Which should make it easier to setup. I updated with my sensor names and it seems to be working :) 

18 hours ago, -cK- said:

Taking a stab in the dark but Perhaps those might be under input_2 instead of input?

image.thumb.png.49f0bf4b58c756b98a0999efaded3f42.png

Hi thanks for the reply I tried input 2 but no luck either. Its weird that I get the amps and volts for pv 3 but not the wattage?

 

Still only seing the volts and amps on pv3 not sure where the issue lies.

I did try input 2 but then I lose everything on pv 3

Here are my yaml settings if it helps?

 

image.thumb.png.5e0d48c4931366bd1275271a6bc7103d.png
##### Put in your Plant Index for your Plant. 0 should work 
  - sensor: 
      - name: "Sunsynk plant index"
        state: "0"
        unique_id: "sensor.sunsynk_plant_index"
##### Put in your Invertor Index for your 1st Invertor. 0 should work 
  - sensor: 
      - name: "Sunsynk Invertor 1 index"
        state: "0"
        unique_id: "sensor.sunsynk_invertor_1_index"
##### Put in your Invertor Index for your 2nd Invertor. Only Change if you have 2 Invertors
  - sensor: 
      - name: "Sunsynk Invertor 2 index"
        state: "DONOTEDIT"
        unique_id: "sensor.sunsynk_invertor_2_index"
##### Number of Items to return in queries. Default 10
  - sensor: 
      - name: "Sunsynk Return Items"
        state: 10
        unique_id: "sensor.sunsynk_return_items"
##### Source for Invertor List - P;ant based  
  - sensor: 
      - name: "Sunsynk Inverter URL"
        state: true
        unique_id: "sensor.sunsynk_inverter_url"
#####
#####
##### DO NOT EDIT ANYTHING UNDER HERE
#####
#####
##### Plant Information
  - sensor: 
      - name: "Sunsynk Invertor List"
        state: "DONOTEDIT"
        unique_id: "sensor.sunsynk_invertor_list"
  - sensor: 
      - name: "Sunsynk Plant List"
        state: "DONOTEDIT"
        unique_id: "sensor.sunsynk_plant_list"
  - sensor: 
      - name: "Sunsynk Notifications"
        state: ""
        unique_id: "sensor.sunsynk_notifications"
##### Core Sensors Invertor 1
  - sensor: 
      - name: "Sunsynk Flow"
        state: ""
        unique_id: "sensor.sunsynk_flow"
  - sensor: 
      - name: "Sunsynk Output"
        state: ""
        unique_id: "sensor.sunsynk_output"
  - sensor: 
      - name: "Sunsynk Battery"
        state: ""
        unique_id: "sensor.sunsynk_battery"
  - sensor: 
      - name: "Sunsynk Input"
        state: ""
        unique_id: "sensor.sunsynk_input"
  - sensor: 
      - name: "Sunsynk Grid"
        state: ""
        unique_id: "sensor.sunsynk_grid"
  - sensor: 
      - name: "Sunsynk Load"
        state: ""
        unique_id: "sensor.sunsynk_load"
  - sensor: 
      - name: "Sunsynk Settings"
        state: ""
        unique_id: "sensor.sunsynk_settings"
  - sensor: 
      - name: "Sunsynk Events 1"
        state: ""
        unique_id: "sensor.sunsynk_events_1"
  - sensor: 
      - name: "Sunsynk Events 2"
        state: ""
        unique_id: "sensor.sunsynk_events_2"
  - sensor: 
      - name: "Sunsynk Events 3"
        state: ""
        unique_id: "sensor.sunsynk_events_3"
  - sensor: 
      - name: "Sunsynk Temp Data"
        state: ""
        unique_id: "sensor.sunsynk_temp_data"
##### Core Sensors Invertor 2
  - sensor: 
      - name: "Sunsynk Flow 2"
        state: ""
        unique_id: "sensor.sunsynk_flow_2"
  - sensor: 
      - name: "Sunsynk Output 2"
        state: ""
        unique_id: "sensor.sunsynk_output_2"
  - sensor: 
      - name: "Sunsynk Battery 2"
        state: ""
        unique_id: "sensor.sunsynk_battery_2"
  - sensor: 
      - name: "Sunsynk Input 2"
        state: ""
        unique_id: "sensor.sunsynk_input_2"
  - sensor: 
      - name: "Sunsynk Grid 2"
        state: ""
        unique_id: "sensor.sunsynk_grid_2"
  - sensor: 
      - name: "Sunsynk Load 2"
        state: ""
        unique_id: "sensor.sunsynk_load_2"
  - sensor: 
      - name: "Sunsynk Settings 2"
        state: ""
        unique_id: "sensor.sunsynk_settings_2"
  - sensor: 
      - name: "Sunsynk Events 1 2"
        state: ""
        unique_id: "sensor.sunsynk_events_1_2"
  - sensor: 
      - name: "Sunsynk Events 2 2"
        state: ""
        unique_id: "sensor.sunsynk_events_2_2"
  - sensor: 
      - name: "Sunsynk Events 3 2"
        state: ""
        unique_id: "sensor.sunsynk_events_3_2"
  - sensor: 
      - name: "Sunsynk Temp Data 2"
        state: ""
        unique_id: "sensor.sunsynk_temp_data_2"
##### Misc Sensors for Energy
  - sensor:
      - name: "Sunsynk Battery etotalchg"
        state_class: total_increasing
        unique_id: "sensor.sunsynk_battery_etotalchg"
        device_class: energy
        unit_of_measurement: kWh
        state: >
            {{state_attr('sensor.sunsynk_battery', 'etotalchg')|float}}
  - sensor:
      - name: "Sunsynk Battery etotaldischg"
        state_class: total_increasing
        unique_id: "sensor.sunsynk_battery_etotaldischg"
        device_class: energy
        unit_of_measurement: kWh
        state: >
            {{state_attr('sensor.sunsynk_battery', 'etotaldischg')|float}}
  - sensor:
      - name: "Sunsynk PV Total"
        state_class: total_increasing
        unique_id: "sensor.sunsynk_pv_total"
        device_class: energy
        unit_of_measurement: kWh
        state: >
            {{state_attr('sensor.sunsynk_input', 'pvtotal')|float}}
  - sensor:
      - name: "Sunsynk Grid Total"
        state_class: total_increasing
        unique_id: "sensor.sunsynk_grid_total"
        device_class: energy
        unit_of_measurement: kWh
        state: >
            {{state_attr('sensor.sunsynk_grid', 'total')|float}}
  - sensor:
      - name: "Sunsynk Load Total"
        state_class: total_increasing
        unique_id: "sensor.sunsynk_load_total"
        device_class: energy
        unit_of_measurement: kWh
        state: >
            {{state_attr('sensor.sunsynk_load', 'total')|float}}
##### Other Sensors 
  - sensor:
      - name: "Current Use Timer"
        state: >
          {% if is_state_attr('sensor.sunsynk_settings', 'peakAndVallery', '1' ) %}
            Use Timer Enabled
          {% else %}
            Use Timer Disabled
          {% endif %}
  - sensor:
      - name: "Sunsynk Battery Temp"
        state: >
            {{state_attr('sensor.sunsynk_battery', 'temp')|float}}
  - sensor:
      - name: "Sunsynk AC Temp"
        state: >
            {{state_attr('sensor.sunsynk_temp_data', 'actemp')|float}}
  - sensor:
      - name: "Sunsynk DC Temp"
        state: >
            {{state_attr('sensor.sunsynk_temp_data', 'dctemp')|float}}
  - sensor:
      - name: "Sunsynk Battery Soc"
        state: >
            {{state_attr('sensor.sunsynk_battery', 'soc')|float}}
  - sensor:
      - name: "Sunsynk Battery Power"
        state: >
            {{state_attr('sensor.sunsynk_battery', 'power')|float}}
  - sensor:
      - name: "Sunsynk PV1"
        state: >
            {{state_attr('sensor.sunsynk_input', 'pv1')|float}}
  - sensor:
      - name: "Sunsynk PV2"
        state: >
            {{state_attr('sensor.sunsynk_input', 'pv2')|float}}
  - sensor:
      - name: "Sunsynk PV3"
        state: >
            {{state_attr('sensor.sunsynk_input', 'pv3')|float}}
  - sensor:
      - name: "Sunsynk Grid Power"
        state: >
            {{state_attr('sensor.sunsynk_grid', 'power')|float}}
  - sensor:
      - name: "Sunsynk Grid Online"
        state: >
            {{state_attr('sensor.sunsynk_grid', 'gridonline')|float}}
  - sensor:
      - name: "Sunsynk Load Power"
        state: >
            {{state_attr('sensor.sunsynk_load', 'totalpower')|float}}
  - sensor:
      - name: "SunSynk Logger Status"
        state: >
         {% if state_attr("sensor.sunsynk_invertor_list", "infos_0_status") == 0 -%}
            Offline
         {%- elif state_attr("sensor.sunsynk_invertor_list", "infos_0_status") == 1 -%}
            Online
         {%- elif state_attr("sensor.sunsynk_invertor_list", "infos_0_status") == 2 -%}
            Warning
         {%- elif state_attr("sensor.sunsynk_invertor_list", "infos_0_status") == 3 -%}
            Fault
         {%- elif state_attr("sensor.sunsynk_invertor_list", "infos_0_status") == 4 -%}
            Upgrading
         {%- else -%}
            {{state_attr("sensor.sunsynk_invertor_list", "infos_0_status")}}
         {%- endif %}
  - sensor:
      - name: "SunSynk Logger Last Update"
        device_class: timestamp
        state: >
         {{ state_attr("sensor.sunsynk_invertor_list", "infos_0_updateAt") }}
  - sensor: 
      - name: "Weather Forecast Calc Result"
        state: ""
        unique_id: "sensor.weather_forecast_calc_result"
  - sensor: 
      - name: "New Minutes To Load Shedding"
        state: 99999
        unique_id: "sensor.new_minutes_to_load_shedding"
  - sensor: 
      - name: "New SunSynk Override Result"
        state: " " 
        unique_id: "sensor.new_sunsynk_override_result"
  - sensor: 
      - name: "New Length Load Shedding"
        state: " "
        unique_id: "sensor.new_length_load_shedding"
  - sensor: 
      - name: "New SunSynk Update Status"
        state: "Not Been Called Yet"
        unique_id: "sensor.new_sunsynk_update_status"
  - sensor: 
      - name: "Calculated Current Solar Pred"
        unique_id: "sensor.calculated.current.solar.pred"
        state: >
         {{  ((float(states('sensor.power_production_now_2')) * 1 ) + (float(states('sensor.power_production_now')) * 1 ))|float  }}
  - sensor: 
      - name: "Sunsynk Stats Last Update"
        device_class: timestamp
        state: 0
        unique_id: "sensor.sunsynk_stats_last_update"
  - sensor: 
      - name: "Sunsynk Battery Depletion"
        state: 0
        unique_id: "sensor.sunsynk_battery_depletion"
  - sensor: 
      - name: "Sunsynk Battery Depletion Load"
        state: 0
        unique_id: "sensor.sunsynk_battery_depletion_load"
####Solar Sensors
####solarday_108: sensor.sunsynk_daily_pv_108
####pv1_power_186: sensor.sunsynk_pv1_186
####pv2_power_187: sensor.sunsynk_pv1_187
####pv3_power_188: sensor.sunsynk_pv1_188
####pv4_power_189: none
####pv1_v_109: sensor.sunsynk_pv1_voltage_109
####pv1_i_110: sensor.sunsynk_pv1_current_110
####pv2_v_111: sensor.sunsynk_pv2_voltage_111
####pv2_i_112: sensor.sunsynk_pv2_current_112
####pv3_v_113: sensor.sunsynk_pv3_voltage_113
####pv3_i_114: sensor.sunsynk_pv3_current_114
####pv4_v_115: none
####pv4_i_116: none

  - sensor:
      - name: "Sunsynk Daily PV 108"
        state: >
          {{state_attr('sensor.sunsynk_input', 'etoday')|float(0)|round(1)}}
  - sensor:
      - name: "Sunsynk PV1 186"
        state: >
          {{state_attr('sensor.sunsynk_input', 'pv1')|float(0)|round(0)}}
  - sensor:
      - name: "Sunsynk PV2 187"
        state: >
          {{state_attr('sensor.sunsynk_input', 'pv2')|float(0)|round(0)}}
  - sensor:
      - name: "Sunsynk PV3 188"
        state: >
          {{state_attr('sensor.sunsynk_input', 'pv3')|float(0)|round(0)}}
  - sensor:
      - name: "Sunsynk PV1 Voltage 109"
        state: >
          {{state_attr('sensor.sunsynk_input', 'pvIV_0_vpv')|float(0)|round(1)}}
  - sensor:
      - name: "Sunsynk PV1 Current 110"
        state: >
          {{state_attr('sensor.sunsynk_input', 'pvIV_0_ipv')|float(0)|round(1)}}
  - sensor:
      - name: "Sunsynk PV2 Voltage 111"
        state: >
          {{state_attr('sensor.sunsynk_input', 'pvIV_1_vpv')|float(0)|round(1)}}
  - sensor:
      - name: "Sunsynk PV2 Current 112"
        state: >
          {{state_attr('sensor.sunsynk_input', 'pvIV_1_ipv')|float(0)|round(1)}}
  - sensor:
      - name: "Sunsynk PV3 Voltage 113"
        state: >
          {{state_attr('sensor.sunsynk_input', 'pvIV_2_vpv')|float(0)|round(1)}}
  - sensor:
      - name: "Sunsynk PV3 Current 114"
        state: >
          {{state_attr('sensor.sunsynk_input', 'pvIV_2_ipv')|float(0)|round(1)}}

####Battery Sensors
####batchargeday_70: sensor.sunsynk_battery_daily_charge_70
####batdischargeday_71: sensor.sunsynk_battery_daily_discharge_71
####battery_voltage_183: sensor.sunsynk_battery_voltage_183
####battery_soc_184: sensor.sunsynk_battery_soc_184
####battery_out_190: sensor.sunsynk_battery_power_190
####battery_current_191: sensor.sunsynk_battery_current_191

  - sensor:
      - name: "Sunsynk Battery Daily Charge 70"
        state: >
          {{state_attr('sensor.sunsynk_battery', 'etodayChg')|float(0)|round(1)}}
  - sensor:
      - name: "Sunsynk Battery Daily Discharge 71"
        state: >
          {{state_attr('sensor.sunsynk_battery', 'etodayDischg')|float(0)|round(1)}}
  - sensor:
      - name: "Sunsynk Battery Voltage 183"
        state: >
          {{state_attr('sensor.sunsynk_battery', 'voltage')|float(0)}}
  - sensor:
      - name: "Sunsynk Battery Soc 184"
        state: >
          {{state_attr('sensor.sunsynk_battery', 'soc')|float(0)|round(0)}}
  - sensor:
      - name: "Sunsynk Battery Power 190"
        state: >
          {{state_attr('sensor.sunsynk_battery', 'power')|float(0)|round(0)}}
  - sensor:
      - name: "Sunsynk Battery Current 191"
        state: >
          {{state_attr('sensor.sunsynk_battery', 'current')|float(0)}}

####Grid Sensors
####grid_buy_day_76: sensor.sunsynk_daily_grid_buy_76
####grid_sell_day_77: sensor.sunsynk_daily_grid_sell_77
####grid_external_power_172: sensor.sunsynk_grid_power_172
####inverter_load_grid_169: sensor.sunsynk_grid_power_169

  - sensor:
      - name: "Sunsynk Grid Power 169"
        state: >
          {{state_attr('sensor.sunsynk_grid', 'power')|float(0)|round(0)}}
  - sensor:
      - name: "Sunsynk Grid Power 172"
        state: >
          {{state_attr('sensor.sunsynk_grid', 'limiterTotalPower')|float(0)|round(0)}}
  - sensor:
      - name: "Sunsynk Daily Grid Buy 76"
        state: >
          {{state_attr('sensor.sunsynk_grid', 'etodayFrom')|float(0)|round(1)}}
  - sensor:
      - name: "Sunsynk Daily Grid Sell 77"
        state: >
          {{state_attr('sensor.sunsynk_grid', 'etodayTo')|float(0)|round(1)}}

####Load Sensors
####loadday_84: sensor.sunsynk_daily_load_84
####essential_power: sensor.sunsynk_load_power_ess
####aux_power_166: sensor.sunsynk_output_aux_power_166

  - sensor:
      - name: "Sunsynk Daily Load 84"
        state: >
          {{state_attr('sensor.sunsynk_load', 'dailyUsed')|float(0)|round(1)}}
  - sensor:
      - name: "Sunsynk Load Power Ess"
        state: >
          {{state_attr('sensor.sunsynk_load', 'totalpower')|float(0)|round(0)}}
  - sensor:
      - name: "Sunsynk Output Aux Power 166"
        state: >
          {{state_attr('sensor.sunsynk_output', 'poweraux')|float(0)|round(0)}}

####Inverter Sensors
####use_timer_248: sensor.current_use_timer_248
####priority_load_243: sensor.energy_mode_243
####inverter_grid_voltage_154: sensor.sunsynk_output_voltage_154
####inverter_load_freq_192: sensor.sunsynk_output_frequency_192
####inverter_out_164: sensor.sunsynk_output_current_164
####inverter_out_175: sensor.sunsynk_output_total_power_175
####grid_status_194: sensor.sunsynk_grid_online_194
####inverter_status_59: sensor.sunsynk_inverter_status_59

  - sensor:
      - name: "Current Use Timer 248"
        state: >
          {% if (state_attr('sensor.sunsynk_settings', 'peakAndVallery') | float) == 1 %}
            on
          {% else %}
            off
          {% endif %}
  - sensor:
      - name: "Energy Mode 243"
        state: >
          {% if (state_attr('sensor.sunsynk_settings', 'energyMode') | float) == 1 %}
            on
          {% else %}
            off
          {% endif %}
  - sensor:
      - name: "Sunsynk Output Voltage 154"
        state: >
          {{state_attr('sensor.sunsynk_output', 'vip_0_volt')|float(0)|round(1)}}
  - sensor:
      - name: "Sunsynk Output current 164"
        state: >
          {{state_attr('sensor.sunsynk_output', 'vip_0_current')|float(0)|round(1)}}
  - sensor:
      - name: "Sunsynk Output Frequency 192"
        state: >
          {{state_attr('sensor.sunsynk_output', 'fac')|float(0)|round(1)}}
  - sensor:
      - name: "Sunsynk Output Total Power 175"
        state: >
          {{state_attr('sensor.sunsynk_output', 'totalpower')|float(0)|round(0)}}
  - sensor:
      - name: "SunSynk Inverter Status 59"
        state: >
          {{ state_attr("sensor.sunsynk_invertor_list", "infos_0_gatewayVO_status") }}
  - sensor:
      - name: "Sunsynk Grid Online 194"
        state: >
          {{state_attr('sensor.sunsynk_grid', 'gridonline')|float|round(0)}}
 

Edited by Jacques Jambo

Can you share a screenshot from developer tools of all the attributes being reported under sensor.sunsynk_input, sensor.sunsynk_input2, ensor.sunsynk_input3 etc

@-cK- I've opted for a single markdown card that uses if logic to replace the conditional cards (still testing). I guess the end result is the same. Also applied some other formatting. I've also started moving some of the logic onto the esp32 just as a POC. 

image.png.962a41f30389b98605d32ab9be8a3c82.png

{% set bat_power = states('sensor.battery_output_power') | int %}
{% if states('sensor.battery_status') == "negative" -%}
  {% if states('sensor.battery_charging_time_left') | float <= 10800 %}
  <ha-alert alert-type="success"> Charge to {{ states('sensor.markdown_battery_charge_time_left') | float | round(0)}}% : {{ states('sensor.battery_charging_time_left_friendly') }} @ {{  states('sensor.markdown_charge_time') }} </ha-alert>
  {% elif 10800 < (states('sensor.battery_charging_time_left') | float) <= 21600 %}
  <ha-alert alert-type="warning">Charge to {{ states('sensor.markdown_battery_charge_time_left') | float | round(0)}}% : {{ states('sensor.battery_charging_time_left_friendly') }} @ {{  states('sensor.markdown_charge_time') }} </ha-alert>     
  {% elif states('sensor.battery_charging_time_left') | float > 21601 %}
  <ha-alert alert-type="error">Charge to {{ states('sensor.markdown_battery_charge_time_left') | float | round(0)}}% : {{ states('sensor.battery_charging_time_left_friendly') }} @ {{  states('sensor.markdown_charge_time') }} </ha-alert>
  {% endif %} 
{% elif states('sensor.battery_status') == "positive" %}
  {% if states('sensor.soc_battery_time_left') | float > 21601 %}
  <ha-alert alert-type="success"> Discharge to {{ states('sensor.battery_cap') | float | round(0)}}% @ {{  states('sensor.markdown_discharge_time') }} : Battery runtime is {{ states('sensor.soc_battery_time_left_friendly') }} at current ({{bat_power}} W) battery load</ha-alert>
  {% elif 10800 < (states('sensor.soc_battery_time_left') | float) <= 21600 %}
  <ha-alert alert-type="warning">Discharge to {{ states('sensor.battery_cap') | float | round(0)}}% @ {{  states('sensor.markdown_discharge_time') }} : Battery runtime is {{ states('sensor.soc_battery_time_left_friendly') }} at current ({{bat_power}} W) battery load</ha-alert>     
  {% elif states('sensor.soc_battery_time_left') | float <= 10800 %}
  <ha-alert alert-type="error">Discharge to {{ states('sensor.battery_cap') | float | round(0)}}% @ {{  states('sensor.markdown_discharge_time') }} : Battery runtime is {{ states('sensor.soc_battery_time_left_friendly') }} at current ({{bat_power}} W) battery load</ha-alert>
  {% endif %}
{% endif %}

 

37 minutes ago, slipx said:

Can you share a screenshot from developer tools of all the attributes being reported under sensor.sunsynk_input, sensor.sunsynk_input2, ensor.sunsynk_input3 etc

looks like there are 3 there?

pvIV_0_ppv  pvIV_1_ppv  pvIV_2_ppv. how do i access the 3rd one?

image.thumb.png.24550dea8448bbaac1ab81b949b73d76.png

Edited by Jacques Jambo

I think the problem is with the integration. Try this. Open Node-Red. Double click the Sunsynk Inpu Data node

 

image.thumb.png.7435568efc84da474bd1fa6734d33578.png

 

Replace all the function code in here

 

image.thumb.png.0240cbaea06a6cd18d15ac9de43c64bc.png

with this code

if (typeof msg.payload === 'object') { } else {
    if (msg.payload.includes("RequestError")) {
        node.status("Request Error");
    } else {
        node.status("Unknown Error");
    }
    node.error(msg.payload);
    return null;
}

var returnvalue = {};

function scroll_all_items(s_payload, t_tkey) {
    Object.entries(s_payload).forEach((entry) => {
        const [key, value] = entry;
        if (value === null || value === "") {
            if (t_tkey === "") { returnvalue[key] = "Missing"; } else { returnvalue[t_tkey + "_" + key] = "Missing"; }
        } else if (s_payload[key].length === 0) {
            if (t_tkey === "") { returnvalue[key] = "Missing"; } else { returnvalue[t_tkey + "_" + key] = value; }
        } else if (typeof s_payload[key] === 'object') {
            if (Array.isArray(s_payload[key])) {
                if (t_tkey === "") { process_array(s_payload[key], key); } else { process_array(s_payload[key], t_tkey + "_" + key); }
            } else {
                if (t_tkey === "") { scroll_all_items(s_payload[key], key); } else { scroll_all_items(s_payload[key], t_tkey + "_" + key); }
            }
        } else {
            if (t_tkey === "") { returnvalue[key] = value; } else { returnvalue[t_tkey + "_" + key] = value; }
        }
    });
    return;
}

function process_array(s_payload, t_tkey) {
    if (t_tkey === "infos_0_plantPermission") { returnvalue[t_tkey] = "Not Processed" }
    else {
        for (let i = 0; i < s_payload.length; i++) {
            scroll_all_items(s_payload[i], t_tkey + "_" + i);
        }
    }
    return;
}


var origpayload = msg.payload;
if (origpayload.msg == "Success") {
    msg.payload.attributes = {};
    scroll_all_items(msg.payload.data, "");
    msg.payload.attributes = returnvalue;
    msg.payload.state = parseFloat(msg.payload.data.pvIV[0].ppv) + parseFloat(msg.payload.data.pvIV[1].ppv);
    let currdate = new Date(); node.status(origpayload.msg + " - " + currdate.toLocaleString());
    msg.payload.attributes.pv = parseFloat(msg.payload.data.pvIV[0].ppv) + parseFloat(msg.payload.data.pvIV[1].ppv);
    msg.payload.attributes.pv1 = parseFloat(msg.payload.data.pvIV[0].ppv) ;
    msg.payload.attributes.pv1_volt = parseFloat(msg.payload.data.pvIV[0].vpv);
    msg.payload.attributes.pv1_current = parseFloat(msg.payload.data.pvIV[0].ipv);
    msg.payload.attributes.pv2 = parseFloat(msg.payload.data.pvIV[1].ppv);
    msg.payload.attributes.pv2_volt = parseFloat(msg.payload.data.pvIV[1].vpv);
    msg.payload.attributes.pv2_current = parseFloat(msg.payload.data.pvIV[1].ipv);
    msg.payload.attributes.pv3_current = parseFloat(msg.payload.data.pvIV[2].ipv);
    msg.payload.attributes.pv3 = parseFloat(msg.payload.data.pvIV[2].ppv);
    msg.payload.attributes.pv3_volt = parseFloat(msg.payload.data.pvIV[2].vpv);
    msg.payload.attributes.pv3_current = parseFloat(msg.payload.data.pvIV[2].ipv);	
	
    msg.payload.attributes.pvtotal = parseFloat(msg.payload.data.etotal);
	
    if (global.get("SunSynkDebug") === 1) { node.error(msg); }
    return msg;
} else {
    msg.payload = {};
    node.status(origpayload.msg)
    node.error({ state: origpayload.msg, data: origpayload });
    return null;
}

 

Edited by slipx

26 minutes ago, slipx said:

I think the problem is with the integration. Try this. Open Node-Red. Double click the Sunsynk Inpu Data node

 

image.thumb.png.7435568efc84da474bd1fa6734d33578.png

 

Replace all the function code in here

 

image.thumb.png.0240cbaea06a6cd18d15ac9de43c64bc.png

with this code

if (typeof msg.payload === 'object') { } else {
    if (msg.payload.includes("RequestError")) {
        node.status("Request Error");
    } else {
        node.status("Unknown Error");
    }
    node.error(msg.payload);
    return null;
}

var returnvalue = {};

function scroll_all_items(s_payload, t_tkey) {
    Object.entries(s_payload).forEach((entry) => {
        const [key, value] = entry;
        if (value === null || value === "") {
            if (t_tkey === "") { returnvalue[key] = "Missing"; } else { returnvalue[t_tkey + "_" + key] = "Missing"; }
        } else if (s_payload[key].length === 0) {
            if (t_tkey === "") { returnvalue[key] = "Missing"; } else { returnvalue[t_tkey + "_" + key] = value; }
        } else if (typeof s_payload[key] === 'object') {
            if (Array.isArray(s_payload[key])) {
                if (t_tkey === "") { process_array(s_payload[key], key); } else { process_array(s_payload[key], t_tkey + "_" + key); }
            } else {
                if (t_tkey === "") { scroll_all_items(s_payload[key], key); } else { scroll_all_items(s_payload[key], t_tkey + "_" + key); }
            }
        } else {
            if (t_tkey === "") { returnvalue[key] = value; } else { returnvalue[t_tkey + "_" + key] = value; }
        }
    });
    return;
}

function process_array(s_payload, t_tkey) {
    if (t_tkey === "infos_0_plantPermission") { returnvalue[t_tkey] = "Not Processed" }
    else {
        for (let i = 0; i < s_payload.length; i++) {
            scroll_all_items(s_payload[i], t_tkey + "_" + i);
        }
    }
    return;
}


var origpayload = msg.payload;
if (origpayload.msg == "Success") {
    msg.payload.attributes = {};
    scroll_all_items(msg.payload.data, "");
    msg.payload.attributes = returnvalue;
    msg.payload.state = parseFloat(msg.payload.data.pvIV[0].ppv) + parseFloat(msg.payload.data.pvIV[1].ppv);
    let currdate = new Date(); node.status(origpayload.msg + " - " + currdate.toLocaleString());
    msg.payload.attributes.pv = parseFloat(msg.payload.data.pvIV[0].ppv) + parseFloat(msg.payload.data.pvIV[1].ppv);
    msg.payload.attributes.pv1 = parseFloat(msg.payload.data.pvIV[0].ppv) ;
    msg.payload.attributes.pv1_volt = parseFloat(msg.payload.data.pvIV[0].vpv);
    msg.payload.attributes.pv1_current = parseFloat(msg.payload.data.pvIV[0].ipv);
    msg.payload.attributes.pv2 = parseFloat(msg.payload.data.pvIV[1].ppv);
    msg.payload.attributes.pv2_volt = parseFloat(msg.payload.data.pvIV[1].vpv);
    msg.payload.attributes.pv2_current = parseFloat(msg.payload.data.pvIV[1].ipv);
    msg.payload.attributes.pv3_current = parseFloat(msg.payload.data.pvIV[2].ipv);
    msg.payload.attributes.pv3 = parseFloat(msg.payload.data.pvIV[2].ppv);
    msg.payload.attributes.pv3_volt = parseFloat(msg.payload.data.pvIV[2].vpv);
    msg.payload.attributes.pv3_current = parseFloat(msg.payload.data.pvIV[2].ipv);	
	
    msg.payload.attributes.pvtotal = parseFloat(msg.payload.data.etotal);
	
    if (global.get("SunSynkDebug") === 1) { node.error(msg); }
    return msg;
} else {
    msg.payload = {};
    node.status(origpayload.msg)
    node.error({ state: origpayload.msg, data: origpayload });
    return null;
}

 

you are a hero! Its finally working, thank you so much!

 

6 hours ago, slipx said:

@-cK- I've opted for a single markdown card that uses if logic to replace the conditional cards (still testing). I guess the end result is the same. Also applied some other formatting. I've also started moving some of the logic onto the esp32 just as a POC. 

image.png.962a41f30389b98605d32ab9be8a3c82.png

{% set bat_power = states('sensor.battery_output_power') | int %}
{% if states('sensor.battery_status') == "negative" -%}
  {% if states('sensor.battery_charging_time_left') | float <= 10800 %}
  <ha-alert alert-type="success"> Charge to {{ states('sensor.markdown_battery_charge_time_left') | float | round(0)}}% : {{ states('sensor.battery_charging_time_left_friendly') }} @ {{  states('sensor.markdown_charge_time') }} </ha-alert>
  {% elif 10800 < (states('sensor.battery_charging_time_left') | float) <= 21600 %}
  <ha-alert alert-type="warning">Charge to {{ states('sensor.markdown_battery_charge_time_left') | float | round(0)}}% : {{ states('sensor.battery_charging_time_left_friendly') }} @ {{  states('sensor.markdown_charge_time') }} </ha-alert>     
  {% elif states('sensor.battery_charging_time_left') | float > 21601 %}
  <ha-alert alert-type="error">Charge to {{ states('sensor.markdown_battery_charge_time_left') | float | round(0)}}% : {{ states('sensor.battery_charging_time_left_friendly') }} @ {{  states('sensor.markdown_charge_time') }} </ha-alert>
  {% endif %} 
{% elif states('sensor.battery_status') == "positive" %}
  {% if states('sensor.soc_battery_time_left') | float > 21601 %}
  <ha-alert alert-type="success"> Discharge to {{ states('sensor.battery_cap') | float | round(0)}}% @ {{  states('sensor.markdown_discharge_time') }} : Battery runtime is {{ states('sensor.soc_battery_time_left_friendly') }} at current ({{bat_power}} W) battery load</ha-alert>
  {% elif 10800 < (states('sensor.soc_battery_time_left') | float) <= 21600 %}
  <ha-alert alert-type="warning">Discharge to {{ states('sensor.battery_cap') | float | round(0)}}% @ {{  states('sensor.markdown_discharge_time') }} : Battery runtime is {{ states('sensor.soc_battery_time_left_friendly') }} at current ({{bat_power}} W) battery load</ha-alert>     
  {% elif states('sensor.soc_battery_time_left') | float <= 10800 %}
  <ha-alert alert-type="error">Discharge to {{ states('sensor.battery_cap') | float | round(0)}}% @ {{  states('sensor.markdown_discharge_time') }} : Battery runtime is {{ states('sensor.soc_battery_time_left_friendly') }} at current ({{bat_power}} W) battery load</ha-alert>
  {% endif %}
{% endif %}

 

Cool, yea my approach on the markdown was a bit on the clunky side so any cleanup and simplification to the setup will be awesome 👍

I also agree making the battery capacity (size) an input sensor will help simplify the code.

I'm assuming this is a sensor you've added to the setup?  Not seeing it in my devolper tools

sensor.battery_output_power

Edited by -cK-

I'm using ESHome. Its my sensor that reports battery power. For E-Linter it would be sensor.sunsynk_battery_power_190 or equivalent.

BTW this is going to be added to the card soon. Here is a sneak peak. 70% is SOC for the current timeslot. The plug next to the "Timer On" text indicates if Grid Charge is enabled for that slot. The Battery message will update as per the logic in your card

image.png.473fb82f75ed90bf5eb159ec9b2fda1b.png

5 minutes ago, slipx said:

I'm using ESHome. Its my sensor that reports battery power. For E-Linter it would be sensor.sunsynk_battery_power_190 or equivalent.

BTW this is going to be added to the card soon. Here is a sneak peak. 70% is SOC for the current timeslot. The plug next to the "Timer On" text indicates if Grid Charge is enabled for that slot. The Battery message will update as per the logic in your card

image.png.473fb82f75ed90bf5eb159ec9b2fda1b.png

This is great! Looking forward to this! 

Edited by spotity

@Gary Waterworth I'm not versed in Node-Red so a bit lost when it comes to trying to do something in it.

@slipx card has two entities that can control the energyMode and peakAndVallery if set to a switch entity.

 

Quote

 

if you provide the card with a switch entity for these two attributes you can already toggle them from the card. For E-Linter you may need to modify the flows as I know they currently only read data and don't write data

use_timer_248: switch.toggle_system_timer
priority_load_243: switch.toggle_priority_load

 

What would the posibilty be to add a seperate "manual control file" for this perhaps.  I'm trying to figure out the section in your automation file that deals with pushing the commands to sunsynk but to be honest this as a bit beyond my understing.

I'm guessing one can setup a sensor in the config file for the above and then have the states of the switch correspond to the the input value for the attribute (on=1, off=0).  Set up node-red to read the switch state when it changes and then push the command to the sunsynk app.  So if you toggle it on slipx card it would send the command to node-red and onto sunsynk?

This us just a copy paste from your automation file of the sections I think one would need to setup and modify.

image.thumb.png.bc9a4ef747675851aec679ca284e38ff.png

One for system timer and one for priority load.

17 minutes ago, slipx said:

Included in v1.6.0

I'm assuming we will need to setup these sensor for it to work?

sensor:
  - platform: template
    sensors:
      ss_prog1_time:
        friendly_name: "SS Prog1 Time"
        value_template: >
          {% set sellTime1 = state_attr('sensor.sunsynk_settings', 'sellTime1') %}
          {% if sellTime1 %}
            {{ strptime(sellTime1, '%H:%M').strftime('%H:%M') }}
          {% endif %}
sensor:
  - platform: template
    sensors:
      ss_prog1_charge:
        friendly_name: "SS Prog1 Charge"
        value_template: >
          {% set time1on = state_attr('sensor.sunsynk_settings', 'time1on') %}
          {{ 0 if time1on == 'false' else 1 }}
  - sensor:
      - name: "SS Prog1 Capacity"
        state: >
          {{ state_attr('sensor.sunsynk_settings', 'cap1') | float }}

 

Okay think I've got it all setup so for ease of setup here is all the sensors:

image.png.5a3353d1070d3971dc6ae95e99ebf0d1.png

Bindings:

  prog1_time: sensor.ss_prog1_time
  prog1_capacity: sensor.ss_prog1_capacity
  prog1_charge: sensor.ss_prog1_charge
  prog2_time: sensor.ss_prog2_time
  prog2_capacity: sensor.ss_prog2_capacity
  prog2_charge: sensor.ss_prog2_charge
  prog3_time: sensor.ss_prog3_time
  prog3_capacity: sensor.ss_prog3_capacity
  prog3_charge: sensor.ss_prog3_charge
  prog4_time: sensor.ss_prog4_time
  prog4_capacity: sensor.ss_prog4_capacity
  prog4_charge: sensor.ss_prog4_charge
  prog5_time: sensor.ss_prog5_time
  prog5_capacity: sensor.ss_prog5_capacity
  prog5_charge: sensor.ss_prog5_charge
  prog6_time: sensor.ss_prog6_time
  prog6_capacity: sensor.ss_prog6_capacity
  prog6_charge: sensor.ss_prog6_charge

Sensors:

#####
#####
##### Sunsynk-Power-Flow-Card: Add-On v1.6
##### Sensors
#####
#####

  - sensor:
      - name: "SS Prog1 Capacity"
        state: >
          {{ state_attr('sensor.sunsynk_settings', 'cap1') | float }}
  - sensor:
      - name: "SS Prog2 Capacity"
        state: >
          {{ state_attr('sensor.sunsynk_settings', 'cap2') | float }}
  - sensor:
      - name: "SS Prog3 Capacity"
        state: >
          {{ state_attr('sensor.sunsynk_settings', 'cap3') | float }}
  - sensor:
      - name: "SS Prog4 Capacity"
        state: >
          {{ state_attr('sensor.sunsynk_settings', 'cap4') | float }}
  - sensor:
      - name: "SS Prog5 Capacity"
        state: >
          {{ state_attr('sensor.sunsynk_settings', 'cap5') | float }}
  - sensor:
      - name: "SS Prog6 Capacity"
        state: >
          {{ state_attr('sensor.sunsynk_settings', 'cap6') | float }}

Template Sensors:

#####
#####
##### Sunsynk-Power-Flow-Card: Add-On v1.6
##### Sensors Template
#####
#####

      ss_prog1_time:
        friendly_name: "SS Prog1 Time"
        value_template: >
          {% set sellTime1 = state_attr('sensor.sunsynk_settings', 'sellTime1') %}
          {% if sellTime1 %}
            {{ strptime(sellTime1, '%H:%M').strftime('%H:%M') }}
          {% endif %}
      ss_prog1_charge:
        friendly_name: "SS Prog1 Charge"
        value_template: >
          {% set time1on = state_attr('sensor.sunsynk_settings', 'time1on') %}
          {{ 0 if time1on == 'false' else 1 }}
      ss_prog2_time:
        friendly_name: "SS Prog2 Time"
        value_template: >
          {% set sellTime2 = state_attr('sensor.sunsynk_settings', 'sellTime2') %}
          {% if sellTime2 %}
            {{ strptime(sellTime2, '%H:%M').strftime('%H:%M') }}
          {% endif %}
      ss_prog2_charge:
        friendly_name: "SS Prog2 Charge"
        value_template: >
          {% set time2on = state_attr('sensor.sunsynk_settings', 'time2on') %}
          {{ 0 if time2on == 'false' else 1 }}
      ss_prog3_time:
        friendly_name: "SS Prog3 Time"
        value_template: >
          {% set sellTime3 = state_attr('sensor.sunsynk_settings', 'sellTime3') %}
          {% if sellTime3 %}
            {{ strptime(sellTime3, '%H:%M').strftime('%H:%M') }}
          {% endif %}
      ss_prog3_charge:
        friendly_name: "SS Prog3 Charge"
        value_template: >
          {% set time3on = state_attr('sensor.sunsynk_settings', 'time3on') %}
          {{ 0 if time3on == 'false' else 1 }}
      ss_prog4_time:
        friendly_name: "SS Prog4 Time"
        value_template: >
          {% set sellTime4 = state_attr('sensor.sunsynk_settings', 'sellTime4') %}
          {% if sellTime4 %}
            {{ strptime(sellTime4, '%H:%M').strftime('%H:%M') }}
          {% endif %}
      ss_prog4_charge:
        friendly_name: "SS Prog4 Charge"
        value_template: >
          {% set time4on = state_attr('sensor.sunsynk_settings', 'time4on') %}
          {{ 0 if time4on == 'false' else 1 }}
      ss_prog5_time:
        friendly_name: "SS Prog5 Time"
        value_template: >
          {% set sellTime5 = state_attr('sensor.sunsynk_settings', 'sellTime5') %}
          {% if sellTime5 %}
            {{ strptime(sellTime5, '%H:%M').strftime('%H:%M') }}
          {% endif %}
      ss_prog5_charge:
        friendly_name: "SS Prog5 Charge"
        value_template: >
          {% set time5on = state_attr('sensor.sunsynk_settings', 'time5on') %}
          {{ 0 if time5on == 'false' else 1 }}
      ss_prog6_time:
        friendly_name: "SS Prog6 Time"
        value_template: >
          {% set sellTime6 = state_attr('sensor.sunsynk_settings', 'sellTime6') %}
          {% if sellTime6 %}
            {{ strptime(sellTime6, '%H:%M').strftime('%H:%M') }}
          {% endif %}
      ss_prog6_charge:
        friendly_name: "SS Prog6 Charge"
        value_template: >
          {% set time6on = state_attr('sensor.sunsynk_settings', 'time6on') %}
          {{ 0 if time6on == 'false' else 1 }}

 

Hi Folks, 

So I've recently put a Sunsynk inverter in and got my pi out of the drawer this weekend and started with home assistant. 

I'm having an issue with login to my sunsync account and node-red is showing "account or password error"

however using the api.sunsynk.net with those login credentials works on a web browser but not in the node-red flow. I'm new to this but I've been following the instructions on this thread and watched the video scoobs did of it. I'm in the correct region and have the correct flow json file etc.

Anyone got any advice for me

@slipx Just noticed this and was wondering if this is correct, didn't it say floating on previous versions or did you opt to change it to show 0min instead?  Just an observation.

 

image.png.523a096bc2efc5c59818e968b12a4462.png

image.png.bffbaffad89fe1979bdf8dd9888bebc5.png

On 2023/06/03 at 6:16 PM, slipx said:

I'm using ESHome. Its my sensor that reports battery power. For E-Linter it would be sensor.sunsynk_battery_power_190 or equivalent.

BTW this is going to be added to the card soon. Here is a sneak peak. 70% is SOC for the current timeslot. The plug next to the "Timer On" text indicates if Grid Charge is enabled for that slot. The Battery message will update as per the logic in your card

image.png.473fb82f75ed90bf5eb159ec9b2fda1b.png

Does the SOC only work when grid charge enabled? Attribute shutdown_soc seems to be overriding mine

Not sure I fully understand the question but If the grid is connected it uses the time-slot SOC for calculations. If the grid is disconnected it used shutdown_soc or 100% depending on state. The time-slot SOC should always be reported next to current battery SOC

32 minutes ago, slipx said:

Not sure I fully understand the question but If the grid is connected it uses the time-slot SOC for calculations. If the grid is disconnected it used shutdown_soc or 100% depending on state. The time-slot SOC should always be reported next to current battery SOC

Figured this out, was an issue on my timer config in HA. This is resolved

Sorry didn't explain myself correctly. 

Rather then showing the current Time slow SOC, it uses the shutdown_soc. I don't use grid charge on my timer. 

Changing the value of shutdown_soc instead of the current Time SOC

My Time 4 is 8am until 8 pm (time 5) with 100% SOC, so I'm in CAP4 which is correctly reflected in the attributes. 

image.png.0a96a1213794c808a3d67330e062fab3.png

 

I have this mapped to sensor.ss_prog4_capacityimage.thumb.png.b6ba0ca65e846b1719a56a6d6daaf2bb.png

 

image.thumb.png.46b3e76225116629f682b7c00c8e296e.png

image.png.d28065457545121556d8ca89c49301d7.png

image.png

Edited by spotity
Solved

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

Account

Navigation

Search

Search

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.