PV SolaX inverter cloud sensors via API

Hi All,

please could anyone help with error message ?
I inserted code to the conf.yaml , restart HA and in the entities I am able to see it.
But every entity has red exclamation mark with the text:

This entity (‘sensor.solax_soc_level’) does not have a unique ID, therefore its settings cannot be managed from the UI.

Thank you very much Lukas

My Code:

sensor:
- platform: rest
  scan_interval: 60
  resource: https://www.solaxcloud.com/proxyApp/proxy/api/getRealtimeInfo.do?tokenId=2022XXXXXXXXXXXXXXXXXX&sn=SRXXXXXXXX
  name: "Solax Garage"
  json_attributes_path: "$.result"
  json_attributes:
    - yieldtoday
    - yieldtotal
    - powerdc1
    - powerdc2
    - uploadTime
    - inverterStatus
    - acpower
    - feedinpower
    - feedinenergy
    - soc
    - consumeenergy
    - batPower
  value_template: "1" # dummy value; not used; avoids error
- platform: template
  sensors:
    solax_garage_today:
      friendly_name: "Solax Garage today"
      value_template: "{{ state_attr('sensor.solax_garage', 'yieldtoday') }}"
      unit_of_measurement: "kWh"
    solax_garage_total:
      friendly_name: "Solax Garage total"
      value_template: "{{ state_attr('sensor.solax_garage', 'yieldtotal') }}"
      unit_of_measurement: "kWh"
    solax_garage_now:
      friendly_name: "Solax Garage now"
      value_template: "{{ state_attr('sensor.solax_garage', 'acpower') }}"
      unit_of_measurement: "W"
    solax_garage_pv1:
      friendly_name: "Solax Garage PV Power1"
      value_template: "{{ state_attr('sensor.solax_garage', 'powerdc1') }}"
    solax_garage_pv2:
      friendly_name: "Solax Garage PV Power2"
      value_template: "{{ state_attr('sensor.solax_garage', 'powerdc2') }}"
      unit_of_measurement: "W"
      icon_template: mdi:solar-panel
    solax_garage_pin:
      friendly_name: "Solax Garage FeedIn Power"
      value_template: "{{ state_attr('sensor.solax_garage', 'feedinpower') }}"
      unit_of_measurement: "W"
    solax_garage_ein:
      friendly_name: "Solax Garage FeedIn Energy"
      value_template: "{{ state_attr('sensor.solax_garage', 'feedinenergy') }}"
      unit_of_measurement: "kWh"
    solax_garage_soc:
      friendly_name: "Solax Garage Battery Charge level"
      value_template: "{{ state_attr('sensor.solax_garage', 'soc') }}"
      unit_of_measurement: "%"
    solax_garage_econ:
      friendly_name: "Solax Garage Consume Energy"
      value_template: "{{ state_attr('sensor.solax_garage', 'consumeenergy') }}"
      unit_of_measurement: "kWh"
    solax_garage_upload_time:
      friendly_name: "Solax Garage upload time"
      value_template: "{{ state_attr('sensor.solax_garage', 'uploadTime') }}"
      icon_template: mdi:alarm-check
    solax_garage_bat_power:
      friendly_name: "Solax Battery Power"
      value_template: "{{ state_attr('sensor.solax_garage', 'batPower') }}"  
    solax_garage_status:
      friendly_name: "Solax Garage status"
      value_template: >
        {% if state_attr('sensor.solax_garage', 'inverterStatus') == '100' %}Wait
        {% elif state_attr('sensor.solax_garage', 'inverterStatus') == '101' %}Check
        {% elif state_attr('sensor.solax_garage', 'inverterStatus') == '102' %}Normal
        {% elif state_attr('sensor.solax_garage', 'inverterStatus') == '103' %}Fault
        {% elif state_attr('sensor.solax_garage', 'inverterStatus') == '104' %}Permanent Fault
        {% elif state_attr('sensor.solax_garage', 'inverterStatus') == '105' %}Update
        {% elif state_attr('sensor.solax_garage', 'inverterStatus') == '106' %}EPS Check
        {% elif state_attr('sensor.solax_garage', 'inverterStatus') == '107' %}EPS
        {% elif state_attr('sensor.solax_garage', 'inverterStatus') == '108' %}Self-test
        {% elif state_attr('sensor.solax_garage', 'inverterStatus') == '109' %}Idle
        {% elif state_attr('sensor.solax_garage', 'inverterStatus') == '110' %}Standby
        {% elif state_attr('sensor.solax_garage', 'inverterStatus') == '111' %}Pv Wake Up Bat
        {% elif state_attr('sensor.solax_garage', 'inverterStatus') == '112' %}Gen Check
        {% elif state_attr('sensor.solax_garage', 'inverterStatus') == '113' %}Gen Run
        {% else %}I dont know{% endif %}
    solax_now:
      friendly_name: "Inverter Power"
      unit_of_measurement: "W"
      value_template: "{{ (states('sensor.solax_garage_now') | float) }}"
      icon_template: mdi:lightning-bolt-circle
    solax_today:
      friendly_name: "PV today"
      unit_of_measurement: "kWh"
      value_template: "{{ (states('sensor.solax_garage_today') | float) }}"
    solax_total:
      friendly_name: "PV total"
      unit_of_measurement: "kWh"
      value_template: "{{ (states('sensor.solax_garage_total') | float) }}"
    solax_pv_power1:
      friendly_name: "PV Power1"
      unit_of_measurement: "W"
      value_template: "{{ (states('sensor.solax_garage_pv1') | float) }}"
      icon_template: mdi:solar-power-variant-outline
    solax_pv_power2:
      friendly_name: "PV Power2"
      unit_of_measurement: "W"
      value_template: "{{ (states('sensor.solax_garage_pv2') | float) }}"
      icon_template: mdi:solar-power-variant-outline
    solax_pv_power_total:
      friendly_name: "PV Power Total"
      unit_of_measurement: "W"
      value_template: "{{ (states('sensor.solax_garage_pv2') | float) + (states('sensor.solax_garage_pv1') | float) }}"
      icon_template: mdi:solar-power-variant
    solax_house_cons:
      friendly_name: "House Power"
      unit_of_measurement: "W"
      value_template: "{{ (states('sensor.solax_garage_now') | float) - (states('sensor.solax_garage_pin') | float) }}"
      icon_template: mdi:home-lightning-bolt-outline
    solax_feedin_power:
      friendly_name: "Grid Power"
      unit_of_measurement: "W"
      icon_template: mdi:transmission-tower
      value_template: "{{ (states('sensor.solax_garage_pin') | float) }}"
    solax_feedin_energy:
      friendly_name: "FeedIn Energy"
      unit_of_measurement: "kWh"
      value_template: "{{ (states('sensor.solax_garage_ein') | float) }}"
    solax_soc_level:
      friendly_name: "Battery Charge level"
      unit_of_measurement: "%"
      value_template: "{{ (states('sensor.solax_garage_soc') | float) }}"
      icon_template: mdi:home-battery
    solax_batt_power:
      friendly_name: "Battery Power"
      unit_of_measurement: "W"
      value_template: "{{ (states('sensor.solax_garage_bat_power') | float) }}"
      icon_template: mdi:battery
    solax_consume_energy:
      friendly_name: "Consume Energy"
      unit_of_measurement: "kWh"
      value_template: "{{ (states('sensor.solax_garage_econ') | float) }}"
    solax_consume_power:
      friendly_name: "Consume Power"
      unit_of_measurement: "W"
      value_template: "{{ (states('sensor.solax_garage_now') | float) - (states('sensor.solax_garage_pin') | float) }}"
      
# Calculate battery power in and out 
    battery_in:
      friendly_name: Battery in
      unit_of_measurement: W
      value_template: >
        {% if (states('sensor.solax_garage_bat_power') | float ) > 0  %}
          {{ (states('sensor.solax_garage_bat_power') | float | abs) }}
        {% else %}
          0
        {% endif %} 
    battery_out:
      friendly_name: Battery out
      unit_of_measurement: W
      value_template: >
        {% if (states('sensor.solax_garage_bat_power') | float ) < 0  %}
          {{ (states('sensor.solax_garage_bat_power') | float | abs) }}
        {% else %}
          0
        {% endif %}
    
- platform: integration
  source: sensor.battery_in
  name: total_battery_in
  unit_prefix: k
  round: 2
  method: left
- platform: integration
  source: sensor.battery_out
  name: total_battery_out
  unit_prefix: k
  round: 2
  method: left
- platform: integration
  source: sensor.solax_house_cons
  name: selfiehome_energy_spent
  unit_prefix: k
  round: 2
template:
  - sensor:
    - name: test_energy
      state: "{{ states('sensor.solax_total') }}" 
      unit_of_measurement: 'kWh'
      state_class: measurement
      device_class: energy
      attributes:         
          last_reset: '1970-01-01T00:00:00+00:00'
# Solax

Solved:
unique_id:

Very good point! I was using the serial number of the inverter for weeks and got nothing! Its the REGISTRATION number that was needed NOT the serial number!

Thank you!

1 Like

Did you get any response?

I added this to my energy dashboard but I get a message ‘Self-consumed solar energy couldn’t be calculated’ the stored value of the sensor is 54 kWh. do you know whats wrong?

I am now using a 100% local solution, no need to use the solaxcloud: Solax X1 Boost Air Mini : local data

In what yaml file do you place this code?
I have a sensor.yaml file but I don’t know where to fit this in
And if I paste it in configuration.yaml, it says the code is okay, but lets check if I am doing things in the right way :smiley:
*EDIT: I placed the sensors in configuration.yaml, better would be to fit this in a custom.yaml or something, but I didn’t get it done so putted it in configuration.yaml and it works as it should be now!

Testing your code right now. I didn’t get any error messages. Solax X3 here. I only wonder if the state_class: measurement is right in stead of total_increase.
We will see!
*EDIT It works for me with this code, sensorname yieldtotal could have an other name in your own api/setup but you have to choose the total yield, not day total.:

template:
  - sensor:
      - name: PV opbrengst (Total)
        state: "{{ states('sensor.solax_api_yieldtotal') | float }}"
        availability: "{{ states('sensor.solax_api_yieldtotal') | float > 0 }}"
        unit_of_measurement: "kWh"
        state_class: total_increasing
        device_class: energy
        attributes:
           last_reset: "1970-01-01T00:00:00+00:00"

Has anyone else gotten an API error in the past three days? It looks like the Solax Cloud API has been down since Friday.

Yes, same here. The server responds with an exception:

The server is busy. Please try again later!
1 Like

Thanks for confirming.

Very flaky API. Definitely not to be recommended. Put uptime graphs on it about 24 days ago:

It seems API access is open for 10 minutes every hour.

It’s been OK for me since March 7 00:58 UTC.

Hello,

Somebody has a problem with API?
Today, I can’t get information from the API cloud, only for every 1 hour.
Everything was working fine until yesterday.

When I paste the API link to the browser, I got this:

{“exception”:“The overrun has been disabled for 1 hour!”,“success”:false}

Can you confirm that there is a problem on Solax cloud or on my side?
Solax

Ok, it seems like the problem with API.

Now, everything is working again :slight_smile:

OK… I found api strong etc… so far so good.
I have added the modified script to scripts.yaml ? and restarted HA… now what?

just add the newly created sensors to the dashboard

All the numbers of blank and i get

“{“exception”:“The overrun has been disabled for 1 hour!”,“success”:false}”

have disabled HA for a while… see if it it some kind of flood protection

it does work now and then

{“success”:true,“exception”:“Query success!”,“result”:{“inverterSN”:“Hxxxxxxxxxxx”,“sn”:“SVxxxxxxxxxxxxx”,“acpower”:893.0,“yieldtoday”:10.4,“yieldtotal”:132.2,“feedinpower”:0.0,“feedinenergy”:1.8,“consumeenergy”:118.7,“feedinpowerM2”:0.0,“soc”:59.0,“peps1”:0.0,“peps2”:null,“peps3”:null,“inverterType”:“15”,“inverterStatus”:“102”,“uploadTime”:“2023-03-17 15:27:26”,“batPower”:-118.0,“powerdc1”:329.0,“powerdc2”:463.0,“powerdc3”:null,“powerdc4”:null,“batStatus”:“0”}}

I had the same problem with the cloud API not sending data. Mostly it was due to to much requests from my HA and Solax APP (when not at home I use the app more frequent). Seems like sharing the same API.

Thats why I switched over to the API localy, over the wifi stick. It took some configuration and trial by error bot got it working and it is much more stable and with much more frequent data (every 5 to 10 seconds is possible). It is worth the extra trouble to get out of the cloud API from Solax.

1 Like

yes… had to go down this route in the end… but got it working nicely
Solax X1 Hybrid G4 (local & cloud API) - Share your Projects! - Home Assistant Community