
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) | Kuvaus | Tyyppi | Arvoalue | Huomio |
|---|---|---|---|---|
| 5006 | Power Limitation Switch | holding, uint16 | bittikenttä | lukuarvo 170 = pysyvä ”Enabled”-tila; ei tarvita kirjoitusta |
| 5007 | Power Limitation Setting | holding, uint16 | 0–1100 | yksikkö 0,1 %, joten 1100 = 110 % |
| 5030 | Total Active Power | input, int16 | — | AC-teho watteina (testattu SG15RT) |
| 5010 | MPPT1 Voltage | input, uint16 | — | DC-jännite string 1+2 |
| 5011 | MPPT1 Current | input, uint16 | — | DC-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 ainaMath.max(10, ...)— minimirajoitus 10 % estää invertterin sammumisenMath.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ä:
| Tila | MPPT1 jännite | MPPT1 virta | AC-teho |
|---|---|---|---|
| 110 % (vapaa) | 500,9 V | 11,7 A | 11,3 kW |
| 24 % rajoitus | 544,3 V | 7,0 A | 3,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ä.