Sungrow Modbus + tehonrajoitus

Written by

in

Tämä ohje kattaa Sungrow SG15RT -aurinkoinvertterin Modbus TCP -integraation Home Assistantiin sekä dynaamisen tehonrajoituksen toteutuksen EnergyHub-arkkitehtuurissa. Ohje olettaa että HA Core pyörii Docker-kontissa ja Modbus TCP -yhteys invertteriin on toimiva.

Arkkitehtuuritausta löytyy sarjan osista Osa 10 — Aurinko ja teho ja Osa 7 — Hinta ja sulakkeet.

Laitteisto ja yhteys

Invertteri: Sungrow SG15RT (sopii myös muille SG-sarjan invertterille vastaavilla rekistereillä)
Yhteys: Modbus TCP, portti 502
Slave ID: 1 (oletus)
IP-osoite: invertterin oma IP-osoite lähiverkossa

Sungrow SG15RT:ssä Modbus TCP on oletuksena päällä. IP-osoite löytyy invertterin näytöltä tai reitittimen DHCP-listasta. Suosittelen staattista IP-osoitetta tai DHCP-varausta — osoitteen muuttuminen katkaisee yhteyden.

Modbus-konfiguraatio HA:han

Lisää packages/10_integrations.yaml:iin (tai configuration.yaml:iin):

yaml

modbus:
  - name: sungrow
    type: tcp
    host: 192.168.100.XXX  # vaihda invertterin IP-osoitteeseen
    port: 502
    delay: 3  # sekuntia ennen ensimmäistä yhteysyritystä käynnistyksen jälkeen
    timeout: 5
    message_wait_milliseconds: 100
    sensors:
      # --- Tuotanto ---
      - name: Sungrow Active Power Raw
        slave: 1
        address: 5030      # testattu toimivaksi SG15RT fw LCD_BERYL-S_V11_V01_A
        input_type: input
        data_type: int16
        scale: 1
        unit_of_measurement: "W"
        scan_interval: 10

      - name: Sungrow Daily Yield Raw
        slave: 1
        address: 5002      # testattu toimivaksi SG15RT fw LCD_BERYL-S_V11_V01_A
        input_type: input
        data_type: uint16
        scale: 0.1
        unit_of_measurement: "kWh"
        scan_interval: 60

      # --- Tehonrajoituksen tila (luettavissa) ---
      - name: Sungrow Power Limitation Switch
        slave: 1
        address: 5006
        input_type: holding
        data_type: uint16
        scan_interval: 10

      - name: Sungrow Power Limitation Setting
        slave: 1
        address: 5007
        input_type: holding
        data_type: uint16
        scale: 0.1
        unit_of_measurement: "%"
        scan_interval: 10

      # --- MPPT-data (DC-potentiaaliaukkotutkimus) ---
      - name: Sungrow MPPT1 Voltage
        slave: 1
        address: 5010
        input_type: input
        data_type: uint16
        scale: 0.1
        precision: 1
        unit_of_measurement: "V"
        scan_interval: 10

      - name: Sungrow MPPT1 Current
        slave: 1
        address: 5011
        input_type: input
        data_type: uint16
        scale: 0.1
        precision: 1
        unit_of_measurement: "A"
        scan_interval: 10

      - name: Sungrow MPPT2 Voltage
        slave: 1
        address: 5012
        input_type: input
        data_type: uint16
        scale: 0.1
        precision: 1
        unit_of_measurement: "V"
        scan_interval: 10

      - name: Sungrow MPPT2 Current
        slave: 1
        address: 5013
        input_type: input
        data_type: uint16
        scale: 0.1
        precision: 1
        unit_of_measurement: "A"
        scan_interval: 10

      # --- Vaihedata ---
      # Huomio: vaihevirrat mitataan tyypillisesti P1-mittarilta (koko talon
      # vaihevirrat), ei Sungrowin Modbusilta (pelkkä invertteri).
      # Sungrow-spesifiset vaiherekisterit löytyvät Modbus-dokumentaatiosta
      # jos invertterispesifinen vaihedata on tarpeen.

Huomio HA-versiosta: delay-parametrin tuki ja semantiikka Modbus TCP -yhteydessä on muuttunut HA:n eri versioiden välillä. Tarkista oman HA-versiosi virallisesta Modbus-dokumentaatiosta että delay on edelleen tuettu juuri tällä merkityksellä. Jos parametri on poistettu tai sen merkitys on muuttunut, jätä se pois tai korvaa nykyisen dokumentaation mukaisella tavalla.

Rekisterikartta — tehonrajoituksen kannalta tärkeimmät

⚠️ Huomio: Sungrowin Modbus-rekisterikartat voivat muuttua firmware-version, invertterisarjan ja dokumentaatioversion mukaan. Tarkista osoitteet aina oman mallisi virallisesta Modbus-dokumentaatiosta ennen kirjoituksia. Tässä ohjeessa käytetyt osoitteet on testattu SG15RT-mallilla firmware-versiolla LCD_BERYL-S_V11_V01_A.

Rekisteri (osoite)KuvausTyyppiArvoalueHuomio
5006Power Limitation Switchholding, uint16bittikenttälukuarvo 170 = pysyvä ”Enabled”-tila; ei tarvita kirjoitusta
5007Power Limitation Settingholding, uint160–1100yksikkö 0,1 %, joten 1100 = 110 %
5030Total Active Powerinput, int16AC-teho watteina (testattu SG15RT)
5010MPPT1 Voltageinput, uint16DC-jännite string 1+2
5011MPPT1 Currentinput, uint16DC-virta string 1+2

Tärkeä yksityiskohta: rekisteri 5007 käyttää asteikkoa 0,1 % — arvo 1100 tarkoittaa 110 %, arvo 240 tarkoittaa 24 %. Kirjoitetaan aina raaka-arvo ilman skaalauksen huomiointia.

Normaalitila: 110 %

Sungrow SG15RT:ssä normaalitila on 110 % — ei 100 %. Tämä tarkoittaa että invertteri käyttää kaiken paneeleilla saatavilla olevan tehon ilman rajoitusta. Jos normaalitila on 100 %, invertteri rajoittaa itsensä nimellistehoon vaikka paneeleilla olisi enemmän tarjolla (esimerkiksi kylmänä, aurinkoisena päivänä).

Palautuskomento kirjoittaa aina arvon 1100 rekisteriin 5007 — ei sammuta rajoituskytkintä.

Automaatio: MQTT-ohjattu tehonrajoitus

Lisää packages/40_optimization.yaml:iin tai automations.yaml:iin:

yaml

- alias: "MQTT: PV tehonrajoitus"
  id: mqtt_cmd_pv_curtail_action
  mode: queued  # estää päällekkäiset kirjoitukset jos MQTT-viestejä tulee nopeasti
  trigger:
    - platform: mqtt
      topic: "energyhub/command/pv/curtail_pct"
  action:
    - variables:
        curtail_pct: "{{ trigger.payload | int(110) }}"
    - variables:
        curtail_raw: "{{ (curtail_pct | float(110) * 10) | round(0) | int }}"
    - service: modbus.write_register
      data:
        hub: sungrow
        slave: 1
        address: 5007
        value: "{{ curtail_raw }}"
    - service: logbook.log
      data:
        name: "PV rajoitus"
        message: "Rajoitus asetettu: {{ curtail_pct }}% (rekisteri: {{ curtail_raw }})"

Vain rekisteri 5007 kirjoitetaan. Rekisteri 5006 (Power Limitation Switch) on SG15RT:ssä pysyvästi tilassa 170 (”Enabled”) eikä siihen tarvitse koskea — rajoitus aktivoituu pelkällä arvon kirjoituksella 5007:ään. Normaalitila palautetaan kirjoittamalla arvo 1100 (= 110 %).

Dynaaminen rajoituslaskenta Node-REDissä

Node-RED laskee rajoitusprosentin dynaamisesti omakäytön perusteella:

javascript

if (s.isNegativePrice && s.pvPowerW > 500) {
    // Omakäyttö = PV-teho + verkkoteho (negatiivinen = vienti)
    const ownLoad = Math.max(300, s.pvPowerW + Math.min(0, s.gridPowerW));

    // Rajoitusprosentti suhteessa nimellistehoon (15 000 W)
    const pct = Math.max(10, Math.min(95,
        Math.round((ownLoad / s.pvPowerW) * 100)
    ));

    decisions.pvCurtailPct = pct;
}

Arvovalinnat:

  • Math.max(300, ...) — vähintään 300 W omakäyttö oletetaan aina
  • Math.max(10, ...) — minimirajoitus 10 % estää invertterin sammumisen
  • Math.min(95, ...) — maksimirajoitus 95 % estää sahauksen 100 %:n rajalla
  • Palautus täyteen tehoon: Node-RED lähettää arvon 110

Testaus

Testaa rajoitus manuaalisesti:

bash

# Aseta 50 % rajoitus
mosquitto_pub -h localhost -t "energyhub/command/pv/curtail_pct" -m "50"

# Tarkista rekisterien arvo HA Developer Tools → Tilat
# sensor.sungrow_power_limitation_switch → 170 (bittikenttä, normaali arvo)
# sensor.sungrow_power_limitation_setting → 50.0 %

# Palauta täyteen tehoon
mosquitto_pub -h localhost -t "energyhub/command/pv/curtail_pct" -m "110"

Tarkista iSolarCloudista tai HA:sta:

  • Invertterin tila muuttuu ”Grid-connected” → ”Dispatched running” rajoituksen aikana
  • MPPT-jännite nousee rajoituksen aikana (normaali 490–520 V → rajoituksella 540–560 V)
  • DC-teho laskee AC-tehon mukana — invertteri siirtää paneelin pois MPP:ltä

DC-potentiaaliaukko — mitä MPPT-data kertoo

Rajoituksen aikana MPPT-rekisterit eivät kerro saatavilla olevaa paneelipotentiaalia — ne kertovat invertterin valitseman toimintapisteen.

25.5.2026 tehdyssä testissä:

TilaMPPT1 jänniteMPPT1 virtaAC-teho
110 % (vapaa)500,9 V11,7 A11,3 kW
24 % rajoitus544,3 V7,0 A3,6 kW
Muutos+43,4 V−4,7 A−7,7 kW

Jännitenousu osoittaa että invertteri siirsi paneelin toimintapisteen pois maksimitehopisteestä (MPP). Todellinen saatavilla oleva paneeliteho oli ~11 kW, mutta DC-rekisteri näytti vain ~3,8 kW.

Jos halutaan tietää paljonko aurinkoa ”oikeasti” olisi saatavilla rajoituksen aikana, tarvitaan lyhyt testipulssi jossa rajoitus nostetaan hetkellisesti 110 %:iin ja mitataan toteutuva teho.

Tämä havainto on tärkeä myös analytiikan kannalta: pelkkä DC-tehon mittaus ei riitä arvioimaan menetettyä tuotantopotentiaalia rajoituksen aikana. Curtailment vääristää havaintodataa — rajoitustilassa mitattu DC-teho ei kerro mitä paneeleilla olisi tarjolla, vaan mitä invertteri valitsee ottaa.

Yleisimmät ongelmat

Power Limitation Switch näyttää arvoa 170 Tämä on normaali. Rekisteri 5006 on bittikenttä eikä yksinkertainen 0/1-arvo. Arvo 170 tarkoittaa ”Enabled”-tilaa — invertteri hyväksyy rajoituskomennot. Tarkista asetettu prosentti sensor.sungrow_power_limitation_setting-entiteetistä. Lisää halutessasi template-sensori rajoituksen tilan tulkintaan:

yaml

template:
  - sensor:
      - name: "sungrow_power_limitation_state"
        state: >
          {% set v = states('sensor.sungrow_power_limitation_switch_raw') | int(0) %}
          {% if v > 0 %}Enabled{% else %}Disabled{% endif %}

Modbus-yhteys ei toimi

  • Tarkista IP-osoite ja portti 502
  • Varmista että invertteri on toiminnassa (ei yösammutuksessa)
  • Kokeile ping [invertterin-ip]
  • Tarkista palomuuriasetukset

Rekisterikirjoitus ei vaikuta

  • Varmista että kirjoitat oikeaan rekisteriin (5007) ja oikealla slave ID:llä (oletus 1)
  • Rekisteriin 5006 ei tarvitse koskea — se on pysyvästi ”Enabled”-tilassa (170)
  • Jotkut Sungrow-firmware-versiot vaativat kirjoitusoikeuden aktivoinnin iSolarCloudista

Rajoitus ei poistu

  • Lähetä arvo 110: mosquitto_pub -h localhost -t "energyhub/command/pv/curtail_pct" -m "110
  • Varmista että rekisteriin 5007 kirjoitetaan 1100

MPPT-rekisterit näyttävät 0

  • Rekisteriosoitteet voivat vaihdella firmware-version mukaan
  • Tarkista osoitteet Sungrowin virallisesta Modbus-rekisterikartasta
  • SG15RT vs SG5RT rekisterikartat voivat erota

Vastuuvapauslauseke

Modbus-kirjoitukset tehdään omalla vastuulla. Virheelliset rekisterikirjoitukset voivat aiheuttaa invertterin virhetoiminnan tai tuotannon keskeytymisen. Testaa muutokset aina hallitusti — ensin manuaalisesti yhdellä arvolla, seuraa invertterin reaktio, varmista palautus ennen automaation käyttöönottoa. Tämä ohje perustuu yhteen laiteasennukseen — rekisterikartat ja toimintalogiikka voivat erota eri mallien ja firmware-versioiden välillä.

Piditkö artikkelista?

Seuraa blogia myös Blogit.fi:ssä, niin löydät uudet kirjoitukset helposti.

Seuraa blogia Blogit.fi:ssä