Přejít k hlavnímu obsahu
loading
Od Michal Novotný
December 19, 2025
Smart Home a GoodWe

V příspěvku ukážeme krok po kroku jak komunikovat přímo se střídačem Goodwe a dostávát aktuální informace (narozdíl od SEMS portálu). Tyto informace jsou nezbytné pokud chceme v chytrém domě nějak reagovat na aktuální parametry např. spínání dodatečného chlazení nebo spínání zásuvky se zátěží.

Hardware

Pi-Home - pokud nemáte, viz sekci Jak na to

Software

OpenHAB 3

Postup:

1) Připojíme se přes SSH na Raspberry a ověříme zda máme nainstalovaný pip3 manager pro knihovny Python:

sudo apt install python3-pip

pak nainstalujeme knihovnu goodwe:

 sudo pip3 install goodwe

 

2) Přejdeme do adresáře skriptů pro OpenHAB, vytvoříme soubor goodwejson.py a otestujeme komunikaci:

cd /etc/openhab/scripts

sudo nano goodwejson.py

 

vložte zde tento obsah, nahraďte červeně označenou IP adresu vaši reálnou IP adresou střídače Goodwe

import asyncio 
import goodwe 

asyncdef get_runtime_data(): 
   ip_address = '192.168.1.100
   sensors = [ 
       "ppv",               # PV total power (W)
       "ppv1",              # PV1 power (W)
       "ppv2",              # PV2 power (W)
       "temperature",       # Inverter Temp Radiator
       "temperature_air",   # Inverter Temp Air
       "battery_temperature", # battery temperature
       "pbattery1",         # battery power (W) + = charging, - = discharging
       "battery_mode",      # 1=standby, 2=discharge, 3=charge
       "battery_soc",       # battery state of charge (%)
       "active_power",      # grid power (W): - = buy, + = sell
       "grid_in_out",       # 1=sell or export, 2=buy or import
       "house_consumption", # own consumption (W)
       "e_day",             # today's PV energy production (kWh)
       "e_total",           # total PV energy production (kWh)
       "meter_e_total_exp", # total sold (exported) energy (kWh)
       "meter_e_total_imp" # total bought or imported energy (kWh)
   ] 

   inverter = await goodwe.connect(ip_address) 
   runtime_data = await inverter.read_runtime_data() 
   print(f'{{') 
   for sensor in inverter.sensors(): 
       if sensor.id_ in runtime_data: 
           if sensor.id_ in sensors: 
               print(f'"{sensor.id_}": {runtime_data[sensor.id_]},') 
   print(f'"end": 0') 
   print(f"}}") 

asyncio.run(get_runtime_data())


 

uložte klávesovou zkratkou CTRL+O, potvrďte Enterem a ukončete editor nano (CTRL+X)

Vyzkoušejte zda skript načte aktuální data, např:
 

python3 goodwejson.py

 

3) Vytvořte do stejné složky ještě skript goodwe.sh:

sudo nano goodwe.sh

a vložte následující obsah:


#!/bin/bash
 
RESULT=$(python3 /etc/openhab/scripts/goodwejson.py)

echo"$RESULT"| tr '\n'' '


 

uložte klávesovou zkratkou CTRL+O, potvrďte Enterem a ukončete editor nano (CTRL+X)

Spustíme ještě nad souborem příkaz ohledně nastavení práv:

sudo chmod 744 goodwe.sh

a přídáme jej také do souboru exec.whitelist kvůli povolení spouštění:

sudo nano /etc/openhab/misc/exec.misc

měl by obsahovat následující:

# For security reasons all commands that are used by the exec binding or transformation need to be whitelisted.
# Every command needs to be listed on a separate line below.
bash /etc/openhab/scripts/goodwe.sh
 

uložte klávesovou zkratkou CTRL+O, potvrďte Enterem a ukončete editor nano (CTRL+X).

4) Vytvoříme .things soubor pro OpenHAB, kde definujeme skript a frekvenci spouštění (dle informací na fórech nechoďte pod 30 vteřin, může vám to pak blokovat SEMS portál)

sudo nano /etc/openhab/things/exec.things

Vložte zde obsah:

exec:command:goodwe_json [command="bash /etc/openhab/scripts/goodwe.sh",interval=30, timeout=10, autorun=false]

 

uložte klávesovou zkratkou CTRL+O, potvrďte Enterem a ukončete editor nano (CTRL+X).

5) Definujeme .items soubor pro OpenHAB - definice vlastních objektů

sudo nano /etc/openhab/items/goode.items

Vložte zde obsah:

String ZP_JSON_Out "[%s]" {channel="exec:command:goodwe_json:output"}
Number:Energy   zpPv              "zpPv [%.0f W]"        <energy>
Number:Energy   zpPv1             "zpPv [%.0f W]"        <energy>
Number:Energy   zpPv2             "zpPv [%.0f W]"        <energy>
Number:Energy   zpIRad            "zpPv [%.1f °C]"        <energy>
Number:Energy   zpIAir            "zpPv [%.1f ˚C]"        <energy>
Number:Energy   zpBatteryTemp     "zpPv [%.1f °C]"        <energy>
Number:Energy   zpBattery         "zpBattery [%.0f W]"   <battery>
Number          zpBatteryStatus   "zpBatteryStatus [%d]" <battery>
Number          zpSoc             "zpSoc [%d %%]"        <battery>
Number:Energy   zpActivePower     "zpActivePower [%.0f W]" <energy>
Number          zpGridStatus      "zpGridStatus [%d]"
Number:Energy   zpConsumption     "zpConsumption [%.0f W]" <energy>
Number:Energy   zpEday            "zpEday [%.1f kWh]"    <energy>
Number:Energy   zpEtotal          "zpEtotal [%.0f kWh]"    <energy>
Number:Energy   zpEtotalExp       "zpEtotalExp [%.0f kWh]"    <energy>
Number:Energy   zpEtotalImp       "zpEtotalImp [%.0f kWh]"    <energy>

uložte klávesovou zkratkou CTRL+O, potvrďte Enterem a ukončete editor nano (CTRL+X).

 6) Finálně definujeme .rules soubor pro OpenHAB - transformace hodnot

sudo nano /etc/openhab/rules/goode.rules

Vložte zde obsah:

rule "ZP JSON transform"
when
    Item ZP_JSON_Out changed
then
    val Pv = transform("JSONPATH","$.ppv",ZP_JSON_Out.state.toString)
    val Pv1 = transform("JSONPATH","$.ppv1",ZP_JSON_Out.state.toString)
    val Pv2 = transform("JSONPATH","$.ppv2",ZP_JSON_Out.state.toString)
    val InvRadTemp = transform("JSONPATH","$.temperature",ZP_JSON_Out.state.toString)
    val InvAirTemp = transform("JSONPATH","$.temperature_air",ZP_JSON_Out.state.toString)
    val BatteryTemp = transform("JSONPATH","$.battery_temperature",ZP_JSON_Out.state.toString)
    val Battery  = transform("JSONPATH","$.pbattery1",ZP_JSON_Out.state.toString)
    val BatteryStatus =  transform("JSONPATH","$.battery_mode",ZP_JSON_Out.state.toString)
    val Soc = transform("JSONPATH","$.battery_soc",ZP_JSON_Out.state.toString)
    val ActivePower = transform("JSONPATH","$.active_power",ZP_JSON_Out.state.toString)
    val GridStatus = transform("JSONPATH","$.grid_in_out",ZP_JSON_Out.state.toString)
    val Consumption = transform("JSONPATH","$.house_consumption",ZP_JSON_Out.state.toString)
    val Eday = transform("JSONPATH","$.e_day",ZP_JSON_Out.state.toString)
    val Etotal = transform("JSONPATH","$.e_total",ZP_JSON_Out.state.toString)
    val EtotalExp = transform("JSONPATH","$.meter_e_total_exp",ZP_JSON_Out.state.toString)
    val EtotalImp = transform("JSONPATH","$.meter_e_total_imp",ZP_JSON_Out.state.toString)


    zpPv.postUpdate(Pv)
    zpPv1.postUpdate(Pv1)
    zpPv2.postUpdate(Pv2)
    zpIRad.postUpdate(InvRadTemp)
    zpIAir.postUpdate(InvAirTemp)
    zpBatteryTemp.postUpdate(BatteryTemp)
    zpBattery.postUpdate(Battery)
    zpBatteryStatus.postUpdate(BatteryStatus)
    zpSoc.postUpdate(Soc)
    zpActivePower.postUpdate(ActivePower)
    zpGridStatus.postUpdate(GridStatus)
    zpConsumption.postUpdate(Consumption)
    zpEday.postUpdate(Eday)
    zpEtotal.postUpdate(Etotal)
    zpEtotalExp.postUpdate(EtotalExp)
    zpEtotalImp.postUpdate(EtotalImp)
end

 

uložte klávesovou zkratkou CTRL+O, potvrďte Enterem a ukončete editor nano (CTRL+X).

 Hotovo. Nyní se podívejte do OpenHAB pod Items a informace by se vám měly zobrazovat a aktualizovat. Můžete si stáhnout Widget z tohoto vlákna: https://community.openhab.org/t/animated-energy-widget/133510 a dosadit zde vaše hodnoty z GoodWe.

 

Příklady dashboardů s instalovanou FVE:

 

 

 

 

Štítky

Přidat komentář

Prostý text

  • Nejsou povoleny HTML značky.
  • Řádky a odstavce se zalomí automaticky.
  • Web page addresses and email addresses turn into links automatically.