Ve svém předchozím příspěvku jsem se pokoušel vyhodnotit návratnost fotovoltaické elektrány.
Elektrárnu jsem si pořídil „na klíč“ a následně jsem se v tom začal vrtat, tedy integrovat ji do domácího řídícího systému.
Dnes se podíváme na přenos údajů mezi on-grid měničem RCT inverter 6.0 a PLC řady Unipi Neuron s běžícím PLC Mervis.
Návod je velmi pravděpodobně zcela obecný pro jakýkoli měnič od firmy RCT a libovolné PLC, které umožňuje komunikovat pomocí Modbus TCP.
Pro vyčítání dat z měniče jsem využil utilitu rctclient, která s měničem komunikuje po ethernetu.
Rctclient lze celkem pohodlně instalovat přes PIP
$pip3 install -U rctclient
Pro používaní z příkazové řádky bude patrně nutné ješte instalovat knihovny
$pip3 install -U rctclient[cli]
Pokud ho budete instalovat do kontroléru unipi neuron, bude pravděpodobně nutná ještě následující příprava
$sudo apt-get update $sudo apt-get install python3-pip
P.S. v mervisu není nastavena cesta k adresáři .local/bin kam se rctclient nainstaluje
/home/unipi/.local/bin/
Seznam podporovaných registrů/údajů https://github.com/svalouch/python-rctclient/blob/main/src/rctclient/registry.py
Registrů/údajů je opravdu hodně a přestože jsou popsané, vyznat se v nich může být trochu oříšek. Navíc komplikovaný faktem, ze s měničem je možné komunikovat pouze pokud je venku světlo. Po setmění se vypne a nepřišel jsem jednoduchý způsob jak ho probudit.
Příklad vyčtení aktuáního DC napětí na stringu
$rctclient read-value --host 192.168.1.1 --name 'dc_conv.dc_conv_struct[0].u_sg_lp'
Mervis má poměrně omezené možnosti jak komunikovat s Linuxem ve kterém běží. Jednou z mála je použití rozhraní Modbus TCP, kde je velká výhoda značná jednoduchost, nevýhoda značná omezenost (přenos pouze 16b čísel).
Pro realizaci Modbus TCP komunikace jsem si vybral utilitu mbpoll.
Mbpoll je možné instalovat přímo z mervis repozitáře, tedy bez většího úsilí
$sudo apt install mbpoll
Zápis i čtení dat jsou velmi jednoduché
zápis hodnoty 27 na localhost:503, modbus client s adresou 9 do registru 2 provedeme následující příkazem
$mbpoll localhost -p 503 -a 9 -r 2 -W 27 mbpoll 1.4-25 - FieldTalk(tm) Modbus(R) Master Simulator Copyright © 2015-2019 Pascal JEAN, https://github.com/epsilonrt/mbpoll This program comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it under certain conditions; type 'mbpoll -w' for details. Protocol configuration: Modbus TCP Slave configuration...: address = [9] start reference = 2, count = 1 Communication.........: localhost, port 503, t/o 1.00 s, poll rate 1000 ms Data type.............: 16-bit register, output (holding) register table Written 1 references.
Čtení je podobně jednoduché, parametrem -q zapínáme tichý mód, aby se výstup lépe zpracovával a parametrem -c 6 říkáme že chceme vyčíst 6 registrů
$mbpoll localhost -p 503 -a 9 -r 2 -q -1 -c 6 -t4 -- Polling slave 9... [2]: 114 [3]: 0 [4]: 0 [5]: 992 [6]: 39 [7]: 0
Následuje výpis jednoduchého skriptu, který vyčítá z měniče 5 hodnot a posílá je do mervisu.
Pro jistotu po startu pozabíjíme případné předchozí instance skriptu i utility rctclient a čtení i zápis v případě neúspěchu opakujeme.
Pokud se měnič neozývá na ping, tak se o další komunikaci nepokoušíme.
Dále je třeba energie naškálovat do 16bit registrů.
#!/bin/bash RCTIP="192.168.1.112" # modbus write single register # mb_write register value function mb_write() { echo "---- Modbus write ----" echo " reg $1 = $2" for I in 1 2 3 4 5 do RES=$(mbpoll localhost -p 503 -a 9 -r $1 -1 -o 0.1 -W $2) STATUS=$? if [ $STATUS -eq 0 ] then break fi sleep 0.1 echo " repeat $I" RES=0 #default value done } # rct inverter read single value # mb_read register function rct_read() { echo "---- RCT read ----" echo " reg $1" for I in 1 2 3 do RES=$(/home/unipi/.local/bin/rctclient read-value --host $RCTIP --name $1) STATUS=$? if [ $STATUS -eq 0 ] then echo "val $RES" break fi sleep 1 echo " repeat $I" RES=0 #default value done } #kill previous instances script_name=${BASH_SOURCE[0]} for pid in $(pidof -x $script_name); do if [ $pid != $$ ]; then kill -9 $pid echo "Killed previous instance $pid" fi done for pid in $(pidof -x "rctclient"); do kill -9 $pid echo "Killed runing instance of rctclient $pid" done #stop in inverter is sleeping RES=$(ping -c 3 -i 0.2 $RCTIP) if [ $? -ne 0 ] then echo "Inverter is sleeping" exit 1 fi rct_read 'dc_conv.dc_conv_struct[0].u_sg_lp' mb_write 2 $RES rct_read 'dc_conv.dc_conv_struct[0].p_dc' mb_write 3 $RES rct_read 'g_sync.p_ac_sum_lp' mb_write 4 $RES rct_read 'energy.e_ac_day' if [ $(bc <<< "scale=0; $RES/1") -gt 0 ] then # Wh -> kWh/100 (1234Wh -> 1.23Wh) RES=$(bc <<< "scale=0; $RES/10") mb_write 5 $RES fi rct_read 'energy.e_ac_total' if [ $(bc <<< "scale=0; $RES/1") -gt 0 ] then # Wh -> MWh/100 RES=$(bc <<< "scale=0; $RES/10000") mb_write 6 $RES fi
Skript spouštím každou minutu přes cron
crontab -e * * * * * /home/unipi/rct2mervis.sh
Na závěr ješte ukázka nastevení Mervisu.
A to je pro dnešek vše. Příště bych se rád podíval na to jak zkamarádit Unipi Neuron a Wattrouter pro „inteligentní“ řízení boileru tak, aby doma vládla pohoda…
Mel jsem (bohuzel) prilezitost s timhle pristrojem. Jediny co jsem resil bylo prepnout pripojeni k inetu z wifi na ethernet. Moje zjisteni bylo jedno zjisteni "no to snad ne, to prece nemuzou bejt takovy zoufalci" za druhym:
* komunikace po siti - telnet. I ta jejich appka pres to komunikuje
* prihlaseni pres telnet - zadate jmeno, pokud je spatne tak hned ohlasi "bad username". To se pak jednoduse hleda spravny username (ale ono je to stejne "admin")
* heslo k tomu uzivateli je seriovy cislo toho menice. Aspon ze tak, ze to neni nejaky univerzalni "password"
* misto entru se macka "^J"
* nevim jestli to byla nejaka chybka u me, ale ten menic poslouchal na vsech IP adresach v rozsahu, ne jenom na ty co dostal z DHCP. Nastesti jenom na tom portu 23 (telnet).
* bohuzel i kdyz jsem se do toho prihlasil, tak jsem tam nic neudelal, je v tom neco jeste osekanejsiho nez busybox. navic bez helpu a bez dokumentace.
* porad to na me neco sypalo, nejaky logy. Mozna to jsou ty informace o tom co to zrovna dela (=kolik premenuje energie)
* appka v iOS obsahuje stejny veci jako v Androidu, ale nektery proste nefungujou (= fungujou jen v Androidu).
* webovy rozhrani to zadny nema. Jen ta appka
Jako energii to asi meni pekne, ale sitova cast je tam dost zoufala.
Predpokladam ze ta `rctclient` utilita co autor zminuje cte ty data pres ten telnet ;-). takze by se asi wiresharkem dalo i odhalit jak to dela.
A taky zjistit co to vlastne dela v noci. :-)
V noci to (RCT inverver) myslim uplne zdechne... po sundani krytu jsem tam nevidel svitit jedinou ledku. ETH port na switchi ukazuje taky "link down".
Ethernet se aktivoval sam od sebe pouhym pripojenim do swithce. IP adresu nechavam prirazovat pevnou na zaklade MAC.
Za tip s telnetem diky, treba se to bude nekdy hodit. Potvrzuju, ze jsem se tam prihlasil i ze to tam sype nejake logy.
Webove rozhrani to ma pres https://rct-portal.com/ ale to predpokadam nebude to co myslite... :)
K rctclientu jsou na githubu zdrojaky, takze wireshark netreba... :)
O domácí solární elektrárně také uvažuji. Přemýšlel jsem ulehčit si práci a jít více high-level cestou - zvolit invertor, který už má nějaké REST API a integraci s HASS, např. Fronius (https://www.home-assistant.io/integrations/fronius/).
A ovladače potom taky řešit high-level - ZWave přepínače, atd. Nejvíce "low-level" asi tak esphome. Už teď takto ovládám topení i ohřev vody, kdy veškerá logika je v HASSu.
ahoj, zaujla ma časť o ovládaní kúrenia - topenia. Plánujem to aj ja, v dome máme klasické radiatory a dva druhy termostatiských hlavíc (majú rôzne závity), chcem sa opýtať či máte radiatory a ako ich ovládaš? vďaka
Já používám topení infrapanely (značka Wellina), takže mám okruhy, které spínám Z-Wave relátkem (Heatit Z-Din) a na ovládání mám Z-Wave termostaty.
Ale viděl jsem, že existují i Z-Wave hlavice na radiátory.
Vyber komponent s rozumnym api je jiste vyhodny. Odpadne zbytecna mezivrstva.
U menice je ale otazka k cemu je ta komunikace vlasne dobra. :)
V mem pripade jsou v tuto chvili hodnoty prenasene z menice do PLC ciste informativni. Jinymi slovy podle nich v tuto chvili nic neridim, pouze je loguju. Zatim me nenapadlo co bych podle nich mohl ridit. Kdybych mel system s baterii, tak bych asi neco mohl ridit podle aktualniho SoC baterii, ale u bezbaterioveho sytemu... nevim... :)
Pro "presmerovani" pretoku do boileru/topeni pouzivam wattrouter (chystam o nem dalsi blog). Teoreticky by se o to mohlo starat PLC, pokud by bylo dost rychle. Nicmene i tady jsou data z menice k nicemu. Pro rizeni pretoku me nezajima kolik menic vyrabi (stav na svorkach menice), ale kolik proteka pres elektromer cezu (a to, obvykle, menic nevi).