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:
Přidat komentář