Tipp: Solax Wechselrichter und Sonnen Batterie via API auslesen

atrost

Member
Hallo Forum,
wenn man sich immer mehr mit HA beschäftigt und anfängt, sich über den Aufbau von YAML zu informieren, bekommt man tatsächlich mit der Zeit einige Lösungen selber hin.
Hier nun der Code für die Sensoren der beiden oben genannten Geräte:
YAML:
rest:

# Batterie
  - resource: http://192.168.xxx.xxx:80/api/v2/latestdata
    method: GET
    headers:
      User-Agent: Home Assistant
      Content-Type: application/json
      Auth-Token: xxxxxxxxxx
    scan_interval: 30
    timeout: 15
    sensor:
        # Aktuelle Stromproduktion
      - name: solar_power_w
        value_template: '{{ value_json["Production_W"] }}'
        unit_of_measurement: W
        device_class: power
      
        # Aktueller Ladestand in %
      - name: battery_soc
        value_template: '{{ value_json["USOC"] }}'
        unit_of_measurement: '%'
        device_class: battery
      
        # Aktueller Ladestand in Wh
      - name: battery_soc_energy
        value_template: '{{ (value_json["USOC"]|float / 100 * value_json["FullChargeCapacity"]|float)|round(0)|int }}'
        unit_of_measurement: Wh
        device_class: energy 
      
        # Hausverbrauch
      - name: house_consumption
        value_template: '{{ value_json["Consumption_W"] }}'
        unit_of_measurement: W
        device_class: power
      
        #Kapazität der Batterie
      - name: battery_capacity
        value_template: '{{ value_json["FullChargeCapacity"] }}'
        unit_of_measurement: Wh
        device_class: energy
      
        # Differenz Erzeugung minus Hausverbrauch
      - name: battery_setpoint_w
        value_template: '{{ value_json["SetPoint_W"] }}'
        unit_of_measurement: W
        device_class: power
      
        # Differenz Erzeugung minus Batterieladung minus Hausverbrauch = Einspeisung ins Netz
      - name: battery_consumption_production_diff
        value_template: '{{ value_json["Pac_total_W"] }}'
        unit_of_measurement: W
        device_class: power
      
        # Einspeisung oder Bezug Netz
      - name: battery_einspeisung_netz
        value_template: '{{ (value_json["SetPoint_W"]|float - value_json["Pac_total_W"]|float) }}'
        unit_of_measurement: W
        device_class: power
      
        # Zeitstempel
      - name: battery_timestamp
        value_template: '{{ value_json["Timestamp"] }}'

# Wechselrichter     
  - resource: https://www.solaxcloud.com:9443/proxy/api/getRealtimeInfo.do?tokenId=xxxxxxxxxx&sn=XXXXXXXXXX
    scan_interval: 30
    sensor:
        # Aktuelle Stromerzeugung der PV-Anlage
      - name: solax_now
        value_template: '{{ value_json.result.acpower }}'
        unit_of_measurement: "W"
        device_class: power
      
        # Heutige Stromerzeugung
      - name: solax_today
        value_template: '{{ value_json.result.yieldtoday }}'
        unit_of_measurement: "kWh"
        device_class: power
      
        # Gesamte STromerzeugun
      - name: solax_total
        value_template: '{{ value_json.result.yieldtotal }}'
        unit_of_measurement: "kWh"
        device_class: power
      
        # Zeitstempel
      - name: solax_upload_time
        value_template: "{{ value_json.result.uploadTime }}"
      
        # Status der PV-Anlage
      - name: solax_status
        value_template: >
          {% if value_json.result.inverterStatus == '100' %}Wait
          {% elif value_json.result.inverterStatus == '101' %}Check
          {% elif value_json.result.inverterStatus == '102' %}Normal
          {% elif value_json.result.inverterStatus == '103' %}Fault
          {% elif value_json.result.inverterStatus == '104' %}Permanent Fault
          {% elif value_json.result.inverterStatus == '105' %}Update
          {% elif value_json.result.inverterStatus == '106' %}EPS Check
          {% elif value_json.result.inverterStatus == '107' %}EPS
          {% elif value_json.result.inverterStatus == '108' %}Self-test
          {% elif value_json.result.inverterStatus == '109' %}Idle
          {% elif value_json.result.inverterStatus == '110' %}Standby
          {% elif value_json.result.inverterStatus == '111' %}Pv Wake Up Bat
          {% elif value_json.result.inverterStatus == '112' %}Gen Check
          {% elif value_json.result.inverterStatus == '113' %}Gen Run
          {% else %}I dont know{% endif %}
 
Kleine Aktualisierung bei der Sonnen Batterie bezüglich der Bezeichnungen und der Berechnung der Netzeinspeisung.
Der Zeitstempel ist ein Helfer vom Typ "Datum und/oder Uhrzeit"
YAML:
rest:

# Batterie
  - resource: http://192.168.170.169:80/api/v2/latestdata
    method: GET
    headers:
      User-Agent: Home Assistant
      Content-Type: application/json
      Auth-Token: 21ff5770-47ea-4ccd-8c72-df82ae16714f
    scan_interval: 30
    timeout: 15
    sensor:
        # Aktuelle Stromproduktion
      - name: solar_power_w
        value_template: '{{ value_json["Production_W"] }}'
        unit_of_measurement: W
        device_class: power
       
        # Aktueller Ladestand in %
      - name: battery_soc
        value_template: '{{ value_json["USOC"] }}'
        unit_of_measurement: '%'
        device_class: battery
       
        # Aktueller Ladestand in Wh
      - name: battery_soc_energy
        value_template: '{{ (value_json["USOC"]|float / 100 * value_json["FullChargeCapacity"]|float)|round(0)|int }}'
        unit_of_measurement: Wh
        device_class: energy  
       
        # Hausverbrauch
      - name: house_consumption
        value_template: '{{ value_json["Consumption_W"] }}'
        unit_of_measurement: W
        device_class: power
       
        #Kapazität der Batterie
      - name: battery_capacity
        value_template: '{{ value_json["FullChargeCapacity"] }}'
        unit_of_measurement: Wh
        device_class: energy
       
        # Differenz Erzeugung minus Hausverbrauch = Überschuss
      - name: battery_setpoint_w
        value_template: '{{ value_json["SetPoint_W"] }}'
        unit_of_measurement: W
        device_class: power
       
        # Batterieladung
      - name: battery_consumption_production_diff
        value_template: '{{ value_json["Pac_total_W"] }}'
        unit_of_measurement: W
        device_class: power
       
        #  Netzeinspeisung = Überschuss - Batterieladung
      - name: battery_einspeisung_netz
        value_template: '{{ (value_json["SetPoint_W"]|float - value_json["Pac_total_W"]|float ) }}'
        unit_of_measurement: W
        device_class: power
       
        # Zeitstempel
      - name: battery_timestamp
        value_template: '{{ value_json["Timestamp"] }}'
 
Nach welcher Anleitung bist Du vorgegangen? Weil eine lokale IP im unteren Posting zu sehen ist, nutzt Du die Modbus Variante mittels Wlan Stick lokal oder die Api der Cloud?

Bei mir bekomme ich immer nur einen Wert von "0" nur für die Akkuladung in %, obwohl die Abfrage der Cloud den korrekten Wert von soc ausgibt. Funktioniert dieser bei Dir korrekt?

Ich habe beim aktuellen Hausverbrauch noch einen Fehler drin, den ich nicht finde. Der Wert des Sensors "Haus aktueller Verbrauch" wird negativ, wenn viel vom Dach kommt, wir aber wenig verbrauchen und massiv eingespeisst wird.

Wie hast Du das gelöst?



Ich bin hier nach vorgegangen:
https://community.home-assistant.io/t/solax-x1-hybrid-g4-worked-example/499362 und

Hier mein Code aus der template.yaml:
Code:
#template Sensoren für Solax neuer Versuch
   sensor:
    - name: "PV Tagesertrag"
      state: "{{ state_attr('sensor.solax', 'yieldtoday') }}"
      unit_of_measurement: "kWh"
      unique_id: solax_2
      icon: mdi:flash
      device_class: energy
      state_class: total_increasing

    - name: "PV Gesamtertrag"
    # ab dem 26.09.23
      state: "{{ state_attr('sensor.solax', 'yieldtotal') }}"
      unit_of_measurement: "kWh"
      unique_id: solax_3
      icon: mdi:flash
      device_class: energy
      state_class: total_increasing

    - name: "Solax aktuelle Wechselrichterleistung"
      unit_of_measurement: "W"
      state: "{{ state_attr('sensor.solax', 'acpower') }}"
      unique_id: solax_4
      icon: mdi:flash
      device_class: energy
      state_class: measurement

    - name: "Solax letztes Update um"
      state: >
        {% set time = state_attr('sensor.solax', 'uploadTime') %}
        {{ as_timestamp(time) | timestamp_custom('%H:%M:%S') }}
      unique_id: solax_5
      icon: mdi:clock

    - name: "Solax Akkustatus"
      state: "{{ state_attr('sensor.solax', 'batStatus') }}"
      unique_id: solax_6
      icon: mdi:battery

    - name: "Solax aktuelle PV Produktion"
      state: "{{ state_attr('sensor.solax', 'powerdc1') + state_attr('sensor.solax', 'powerdc2') }}"
      unit_of_measurement: "W"
      device_class: energy
      state_class: measurement
      unique_id: solax_7
      icon: mdi:solar-power-variant

    - name: "Solax Ladestatus"
      state: "{{ state_attr('sensor.solax', 'batPower') }}"
      unit_of_measurement: "W"
      device_class: energy
      state_class: measurement
      unique_id: solax_8
      icon: mdi:battery

    - name: "Solax Akku wird geladen"
      state: >
        {% set attr = state_attr('sensor.solax', 'batPower') %}
        {{ attr if is_number(attr) and (attr|float > 0) else 0 }}
      unit_of_measurement: "W"
      unique_id: solax_9
      icon: mdi:battery

    - name: "Solax Akku wird entladen"
      state: >
        {% set attr = state_attr('sensor.solax', 'batPower') %}
        {{ (0 - attr) if is_number(attr) and (attr|float < 0) else 0 }}
      unit_of_measurement: "W"
      unique_id: solax_10
      icon: mdi:battery

    - name: "Solax Akkustand"
      state: "{{ state_attr('sensor.solax', 'soc') }}"
      unit_of_measurement: "%"
      device_class: battery
      state_class: measurement
      unique_id: solax_12
      icon: mdi:battery

    - name: "Solax aktuelle(r) Bezug/Einspeisung"
      state: >
        {% set attr = state_attr('sensor.solax', 'feedinpower') %}
        {{ (0 - attr) if is_number(attr) else 0 }}
      unit_of_measurement: "W"
      device_class: energy
      state_class: measurement
      unique_id: solax_13
      icon: mdi:transmission-tower

    - name: "Solax aktueller Netzbezug"
      state: >
        {% set attr = state_attr('sensor.solax', 'feedinpower') %}
        {{ (0 - attr) if is_number(attr) and (attr|float < 0) else 0 }}
      unit_of_measurement: "W"
      unique_id: solax_14
      icon: mdi:transmission-tower

    - name: "Solax aktuelle Netzeinspeisung"
      state: >
        {% set attr = state_attr('sensor.solax', 'feedinpower') %}
        {{ attr if is_number(attr) and (attr|float > 0) else 0 }}
      unit_of_measurement: "W"
      unique_id: solax_15
      icon: mdi:transmission-tower

    - name: "Solax Netzeinspeisung gesamt"
    # ab dem 26.09.23
      state: "{{ state_attr('sensor.solax', 'feedinenergy') }}"
      unit_of_measurement: "kWh"
      unique_id: solax_16
      icon: mdi:transmission-tower
      device_class: energy
      state_class: total_increasing

    - name: "Solax Netzbezug gesamt"
    # ab dem 26.09.23
      state: "{{ state_attr('sensor.solax', 'consumeenergy') }}"
      unit_of_measurement: "kWh"
      unique_id: solax_19
      icon: mdi:transmission-tower
      device_class: energy
      state_class: total_increasing

    - name: "PV aktueller Status"
      unique_id: solax_20
      icon: mdi:solar-power-variant
      state: >
          {% set attr = state_attr('sensor.solax', 'inverterStatus') %}
          {% if attr == '100' %}Wait
          {% elif attr == '101' %}Prüfen
          {% elif attr == '102' %}Produktion
          {% elif attr == '103' %}Fehler
          {% elif attr == '104' %}permanenter Fehler
          {% elif attr == '105' %}Update
          {% elif attr == '106' %}EPS Check
          {% elif attr == '107' %}EPS
          {% elif attr == '108' %}Selbsttest
          {% elif attr == '109' %}Leerlauf
          {% elif attr == '110' %}Standby
          {% elif attr == '111' %}Pv Wake Up Bat
          {% elif attr == '112' %}Gen Check
          {% elif attr == '113' %}Gen Run
          {% else %}unknown{% endif %}

    - name: Haus aktueller Verbrauch
      unique_id: home use
      state: >
          {% set battery = states('sensor.solax_battery_use') %}
          {% set grid = states('sensor.solax_grid_power') %}
          {% set solar = states('sensor.solar_panel_power') %}
          {% set total = 0 - battery|float if is_number(battery) else 0 %}
          {% set total = total + (solar|float if is_number(solar) else 0) %}
          {% set total = total + (grid|float if is_number(grid) else 0) %}
          {{ total }}
      state_class: measurement
      icon: 'mdi:flash'
      unit_of_measurement: W
      device_class: power
 
hi danke euch. wenn ich euren code einfüge bekomme ich immer die rote meldung:
UndefinedError: 'value_json' is undefined

idee wo der fehler liegen kann? danke euch!
 
@StefanE:
Hallo Stefan, Du bringst da vielleicht etwas durcheinander.
Meine Beschreibung oben bezieht sich auf die Sonnen Batterie. Die kann ich direkt im Lan erreichen über die IP und dort ist dann auch eine Beschreibung der API hinterlegt.
Der Solax Wechselrichter wird über Deinen Zugang in der Solax Cloud abgerufen.
Folgenden Code habe ich verwendet im Abschnitt "rest:".
Mit diesen Werten generierst Du Templatesensoren, mit denen Du dann rechnen kannst.
Das habe ich nur bei meinen Batterie-Werten gemacht. Weiter unten ein Beispiel dafür!
YAML:
 # Wechselrichter      
  - resource: "https://www.solaxcloud.com:9443/proxy/api/getRealtimeInfo.do?tokenId=???????????????????????"
    scan_interval: 30
    sensor:
        # Aktuelle Stromerzeugung der PV-Anlage
      - name: "solax_now"
        value_template: '{{ value_json.result.acpower }}'
        unit_of_measurement: "W"
        device_class: "energy"
        state_class: "total_increasing"
       
        # Heutige Stromerzeugung
      - name: "solax_today"
        value_template: '{{ value_json.result.yieldtoday }}'
        unit_of_measurement: "kWh"
        device_class: "energy"
        state_class: "total"
       
        # Gesamte Stromerzeugung
      - name: "solax_total"
        value_template: '{{ value_json.result.yieldtotal }}'
        unit_of_measurement: "kWh"
        device_class: "energy"
        state_class: "total"
       
        # Zeitstempel
      - name: "solax_upload_time"
        value_template: "{{ value_json.result.uploadTime }}"
       
        # Status der PV-Anlage
      - name: "solax_status"
        value_template: >
          {% if value_json.result.inverterStatus == '100' %}Wait
          {% elif value_json.result.inverterStatus == '101' %}Check
          {% elif value_json.result.inverterStatus == '102' %}Normal
          {% elif value_json.result.inverterStatus == '103' %}Fault
          {% elif value_json.result.inverterStatus == '104' %}Permanent Fault
          {% elif value_json.result.inverterStatus == '105' %}Update
          {% elif value_json.result.inverterStatus == '106' %}EPS Check
          {% elif value_json.result.inverterStatus == '107' %}EPS
          {% elif value_json.result.inverterStatus == '108' %}Self-test
          {% elif value_json.result.inverterStatus == '109' %}Idle
          {% elif value_json.result.inverterStatus == '110' %}Standby
          {% elif value_json.result.inverterStatus == '111' %}Pv Wake Up Bat
          {% elif value_json.result.inverterStatus == '112' %}Gen Check
          {% elif value_json.result.inverterStatus == '113' %}Gen Run
          {% else %}I dont know{% endif %}

YAML:
rest:

  # Batterie
  - resource: "http://192.168.170.169:80/api/v2/latestdata"
    method: "GET"
    headers:
      User-Agent: "Home Assistant"
      Content-Type: "application/json"
      Auth-Token: "?????????????????????????????????"
    scan_interval: 30
    timeout: 15
    sensor:
        # Aktuelle Stromproduktion
      - name: "batterie_solar_aktuell"
        value_template: '{{ value_json["Production_W"] }}'
        unit_of_measurement: "W"
        device_class: "power"
       
template:
    #Sonnen-Batterie
      #Stromerzeugung
    - name: "batterie_solarproduktion_watt"
      unique_id: "batterie_solarproduktion_watt"
      unit_of_measurement: "W"
      device_class: "power"
      state_class: "total"  
      state: "{{ states('sensor.batterie_solar_aktuell') | float(0) }}"
 

Zurzeit aktive Besucher

Letzte Anleitungen

Statistik des Forums

Themen
4.380
Beiträge
45.239
Mitglieder
3.982
Neuestes Mitglied
ThomasW
Zurück
Oben