PV SolaX inverter cloud sensors via API

Done! I kind of assumed it would happen automatically, since I referenced your post. My mistake :wink:

Does anyone know how you can increase the update time on the readings? Every 5 minutes seems too long.

You can’t, if you want faster updates you have to use Modbus.

I had a feeling that was the case, unfortunately Modbus isn’t an option for me.

I’ve adopted parts of this thread. Among other sensors I’ve the solax_total_yield which shows the total kwh yield of my solar panels all-time. None of these sensors can be used in the Energy dashboards though. So I took the above snippet:

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

The sensor works. It’s slowly counting the kwh throughout the day. I can add it to the energy dashboard just fine, but the dashboard never shows any solar panel activity.

What have I done wrong?

1 Like

Hi, my second day venturing down the home assistant rabbit hole because I wanted to have some automation based on Solax X1 Hybrid G4 outputs.
I have managed to get the information from the cloud and did some slight customization to get the information I want for automation like total PV power and House consumption.
Next step Modbus.
One thing I have learnt/misunderstood. The serial number is the dongle serial number not the inverter for the API query
Thanks to all who have done the hard work to make this happen
Below is what the UI looks like.

PS I hope that I have posted the code correctly

- platform: rest
  scan_interval: 60
  resource: https://www.solaxcloud.com/proxyApp/proxy/api/getRealtimeInfo.do?tokenId=xxxxxxxxxxxxxxx&sn=SVTxxxxx
  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) }}"

Did you find a Solution?
Same problem here. :roll_eyes:

little confused on how this works can someone help knew to home assitant and not sure if im doing this right. Can somone explain how i create the sensor as i get a UndefinedError: ‘value_json’ is undefined error message

Hi.
I have a Solax X3 Hybrid 10.0 D and used your yaml. The problem is that I cannot select it for the energy dashboard - the sensors are simply not visible. What do I need to do to make it available for the energy dashboard? I can use the sensors on my own dashboards, but it is not available in the dropdown menu for the energy dashboard.

I’m running into the same problem, have you found a solution yet?

just add state_class: total_increasing to the template/sensor that has the total kWh

  - name: "Solax Solar energy total"
    state: "{{ ((state_attr('sensor.solax', 'Data')[81] * 65536) + state_attr('sensor.solax', 'Data')[80]) | float / 10 }}"
    unit_of_measurement: "kWh"
    device_class: "energy"
    state_class: total_increasing

and by the way, i did adapt a local API that works with the actual pocket wifi 2.0

Hello, I need your help. I’m still relatively new to HA. I would like to integrate my Solax WR. I copied the code with my data into the configuration.yaml. There is a green tick on it. When testing the configuration I get the following message “Integration error: sensors - Integration ‘sensors’ not found.” Can someone tell me where the problem is. Many Thanks

There are some great suggestions in this thead that heled my get everything working.
For anyone new, I have created a fully worked example.

2 Likes

First post in the forums…
Couple of things to add…I have an X1-Hybrid inverter, 6kW

  1. The inverter registration number starts S V V - it is not S W
  2. If you log in to the Solax Cloud website, then in the left side menu click Service, then API, it will show your token and also a URL that can be copy/pasted to a browser tab
  3. The URL is somewhat different to that shown at the top of this post.

Now time for my tea, and more playing…

1 Like

Just tried this (link a the end) and it all works.

Cloud sensors can be used on dashboard, but made my own with the local sensors.
LOCAL Access with 5sec Polling (X1-Hybrid-G4 with Pocket WIFI)

Only bit not mentioned is how to get your inverter IP address.
I looked at my attached devices in my router settings device name comes up with
IPv4 Address: 192.168.0.xxx ; Device Name: “espressif”

There is another way which is to connect your laptop wifi directly to pocket wifi access point and logging into inverter via 5.8.8.8 IP address

I am a very happy person right now. Thanks to @kamilb

1 Like

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?