Possiedo un impianto fotovoltaico con un inverter X-Hybrid Inverter SK-TL3000. E’ un inverter che, come molti altri, ha il modulo wifi integrato e sul Play Store Android è disponibile un’App dedicata che serve a controllare lo stato della produzione in tempo reale oppure i dati storici.
E’ anche possibile interfacciare l’inverter ad altri sistemi, e non è molto difficile.
Io uso Openhab e Grafana ed ottengo queste interfacce.
Attenzione, non tutti i valori visibili nelle schermate che seguono provengono dall’inverter. I consumi di frigorifero, lavastoviglie e bagno provengono da tre Sonoff Pow R2 mentre i valori il cui nome inizia per SDM provengono da un contatore SDM220-Modbus.
L’interfaccia Grafana non sarà oggetto di questo articolo.
Torniamo all’inverter Solax ed al sistema Openhab.
Dopo avere configurato l’inverter in modo da poterne controllare lo stato sul portale e/o sull’App, occorre, in primis, individuarne l’IP.
Io uso l’App Fing, con la quale faccio lo sniff della lan quando ho apparecchi nuovi ed ho bisogno di individuarne l’IP.
Il mio inverter, ad esempio, ha un Mac Address del tipo C8:93:46:37:??:?? e la scheda di rete è del tipo “MXCHIP Company Limited”.
Per semplicità scriverò gli esempi mantenendo il mio indirizzo IP. Ognuno lo sostituirà con il proprio.
Dal browser scrivere il seguenti indirizzo e premere invio:
http://192.168.1.36/api/realTimeData.htm
otterrò una stringa in formato JSON del tipo
{"method":"uploadsn","version":"Solax_SI_CH_2nd_20170906_DE01","type":"AL_SE","SN":"CB4EA3??","Data":[0.3,0.3,286.4,271.2,2.2,227.9,457,49,12.1,901.4,-995,85,81,48.70,-10.03,-490,42,47,0.0,268.5,,,,,,,,,,,,,,,,,,,,,,0.00,0.00,,,,,,,,49.99,,,0.0,0.0,0,0.00,0,0,0,0.00,0,9,0,0,0.00,0,9],"Status":"2"}
oppure, visitando l’url (inserire l’IP del proprio inverter):
http://192.168.1.36/api/historyData.htm
ottengo una stringa del tipo
[12.1,7.8,185.0,166.6,900.4,1.5,1.9,46.3,57.6,268.5]
Il significato dei campi Data nella stringa in formato JSON è il seguente:
numero campo | Significato | Unità di misura |
0 | corrente stringa 1 | A |
1 | corrente stringa 2 | A |
2 | voltaggio stringa 1 | V |
3 | voltaggio stringa 2 | V |
11 | potenza stringa 1 | W |
12 | potenza stringa 2 | W |
6 | potenza istantanea inverter | W |
5 | voltaggio di rete | V |
10 | potenza prelevata (valore positivo) o immessa (valore negativo) in rete | W |
4 | corrente prelevata o immessa in rete | A |
50 | frequenza di rete | Hz |
8 | energia prodotta oggi | KWh |
9 | energia totale prodotta | KWh |
15 | potenza istantanea sistema di accumulo (valore negativo se prelevata e valore negativo se accumulata) | W |
17 | capacità residua sistema di accumulo | % |
13 | voltaggio batteria sistema di accumulo | V |
14 | caricamento batteria | ? |
16 | temperatura sistema di accumulo | °C |
7 | temperatura inverter | °C |
Come utilizzare i valori in Openhab?
Spiego brevemente come si fa.
Ogni 10 secondi (valore espresso in millisecondi, quindi 10000), Openhab interroga l’inverter e mette nel campo “raw_solax” il valore che ottiene. Una rule analizza contenuto del campo “raw_solax” e ne estrae tutti i valori di interesse.
Quanto detto si può fare intervenendo sui seguenti file di configurazione.
addond.cfg : qui andranno modificate le righe seguenti aggiungendo la parte di interesse:
binding = http1
transformation = jsonpath, regex
default.rules : per semplicità consiglierei di aggiungere un nuovo file chiamato solax.rules nella stessa cartella rules (openhab lo leggerà in automatico); quello che segue è il file che uso io, ognuno potrà comprenderne la formattazione e modificarlo per le proprie esigenze:
rule "solax"
when
Item raw_solax changed
then
var _consumo = Float::parseFloat(transform("JSONPATH", "$.Data[10]", (raw_solax.state).toString))
var _PV1 = Float::parseFloat(transform("JSONPATH", "$.Data[11]", (raw_solax.state).toString))
var _PV2 = Float::parseFloat(transform("JSONPATH", "$.Data[12]", (raw_solax.state).toString))
var _powerNow = Float::parseFloat(transform("JSONPATH", "$.Data[6]", (raw_solax.state).toString))
var _innerTemp = Float::parseFloat(transform("JSONPATH", "$.Data[7]", (raw_solax.state).toString))
var _battery_power = Float::parseFloat(transform("JSONPATH", "$.Data[15]", (raw_solax.state).toString))
var _battery_capacity = Float::parseFloat(transform("JSONPATH", "$.Data[17]", (raw_solax.state).toString))
var _battery_temp = Float::parseFloat(transform("JSONPATH", "$.Data[16]", (raw_solax.state).toString))
var _produzione_oggi=Float::parseFloat(transform("JSONPATH", "$.Data[8]", (raw_solax.state).toString))
var _produzione_totale=Float::parseFloat(transform("JSONPATH", "$.Data[9]", (raw_solax.state).toString))
consumo_solax.postUpdate(_consumo*-1)
produzione_stringa1_solax.postUpdate(_PV1)
produzione_stringa2_solax.postUpdate(_PV2)
produzione_sommaStringhe_solax.postUpdate(_PV1+_PV2)
produzione_powerNow_solax.postUpdate(_powerNow)
produzione_temperatura_solax.postUpdate(_innerTemp)
temperatura_batteria_inverter.postUpdate(_battery_temp)
produzione_potenza_batteria_solax.postUpdate(_battery_power)
produzione_livello_batteria_solax.postUpdate(_battery_capacity)
produzione_oggi_solax.postUpdate(_produzione_oggi)
produzione_totale_solax.postUpdate(_produzione_totale)
end
nel file default.item aggiungere le righe seguenti (ovviamente modificate secondo le proprie necessità):
Group Elettricita (Home)
String raw_solax "Raw Solax" { http="<[http://192.168.1.36/api/realTimeData.htm:10000:REGEX((.*))]"}
Number consumo_solax "Grid [%s W]" <energy> (Elettricita)
Number produzione_stringa1_solax "PV1 [%s W] " <solarplant> (Elettricita)
Number produzione_stringa2_solax "PV2 [%s W]" <solarplant> (Elettricita )
Number produzione_sommaStringhe_solax "Solar [%s W]" <solarplant> (Elettricita)
Number produzione_powerNow_solax "Solar Power Now (Grid Power) [%s W]" <energy> (Elettricita)
Number produzione_temperatura_solax "Inner Temp [%.0f °C]" <temperature> (Elettricita)
Number temperatura_batteria_inverter "Battery Temp [%.0f °C]" <temperature> (Elettricita)
Number produzione_livello_batteria_solax "Livello Batteria [%s %%]" <batterylevel> (Elettricita)
Number produzione_potenza_batteria_solax "Potenza Batteria [%s W]" <energy> (Elettricita)
Number produzione_oggi_solax "Oggi" <energy> (Elettricita)
Number produzione_totale_solax "Totale" <energy> (Elettricita)
nel file default.sitemap aggiungere le righe seguenti:
Text label="Consumi / Produzione" icon="energy" {
Text item=consumo_solax label="Consumo [%s W]"
Text item=produzione_powerNow_solax label="Power Now [%.1f W]"
Text item=produzione_potenza_batteria_solax label="Batteria [%.1f W]"
Text item=produzione_sommaStringhe_solax label="Fotovoltaico [%s W]"
Text item=produzione_stringa1_solax label="PV1 [%s W]"
Text item=produzione_stringa2_solax label="PV2 [%s W]"
Text item=produzione_livello_batteria_solax label="Livello Batteria [%s %%]"
Text item=produzione_oggi_solax label="Produzione oggi [%.1f kWh]"
Text item=produzione_totale_solax label="Produzione totale [%.1f kWh]"
Text item=produzione_temperatura_solax label="Temperatura Inverter [%.1f °C]"
Text item=temperatura_batteria_inverter label="Temperatura Batteria [%.1f °C]"
Questo è quanto, salvo piccoli errori. Attendo eventuali segnalazioni.
Ciao, ho trovato il tuo articolo e lo trovo molto interessante. Hai per caso la documentazione dei registri Modbus del modello di Solax che possiedi? Io ho un TL5000E e non riesco a trovare documentazione relativa ai registri come da fw montato sopra che è il Solax_SI_CH_2nd_20170906_DE01 . Non so se potrai essermi di aiuto ma comunque grazie.
Purtroppo no.