Fotovoltaico – Inverter SOLAX e domotica con Openhab

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 campoSignificatoUnità di misura
0corrente stringa 1A
1corrente stringa 2A
2voltaggio stringa 1V
3voltaggio stringa 2V
11potenza stringa 1W
12potenza stringa 2W
6potenza istantanea inverterW
5voltaggio di reteV
10potenza prelevata (valore positivo) o immessa (valore negativo) in reteW
4corrente prelevata o immessa in reteA
50frequenza di reteHz
8energia prodotta oggiKWh
9energia totale prodottaKWh
15potenza istantanea sistema di accumulo (valore negativo se prelevata e valore negativo se accumulata)W
17capacità residua sistema di accumulo%
13voltaggio batteria sistema di accumuloV
14caricamento batteria ?
16temperatura sistema di accumulo°C
7temperatura 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.

2 replies to Fotovoltaico – Inverter SOLAX e domotica con Openhab

  1. 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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

wp-puzzle.com logo

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.