Střípky solárního barona 01 - rctclient

18. 1. 2024 20:48 (aktualizováno) Great Lama

Úvod

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.

Vyčítání dat z měniče

Pro vyčítání dat z měniče jsem využil utilitu rctclient, která s měničem komunikuje po ethernetu.

Instalace rctclient

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/

Vyčítání údajů

Seznam podporovaných registrů/údajů https://github.com/svalouch/python-rctclient/blob/main/src/rctcli­ent/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'

Zápis dat do PLC

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.

Instalace mbpoll

Mbpoll je možné instalovat přímo z mervis repozitáře, tedy bez většího úsilí

$sudo apt install mbpoll

Zápis a čtení dat

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

Skript

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

Mervis

Na závěr ješte ukázka nastevení Mervisu.

Mervis Modbus

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…

Sdílet