Il programma legge i dispositivi modbus e crea un output compatibile con 123solar (beta) e meterN.
Si consiglia di utilizzare il programma monitor su un bus separato da quello dell'inverter perchè non è garantito il funzionamento del programma monitor insieme al programma aurora sulla stessa seriale.
Il programma in pratica è un sostituto di sdm120c di gianfrdp che la maggior parte di voi usa per la lettura dei contatori eastron.
Monitor, rispetto al programma sdm120c, permette di leggere anche i contatori SDM630 trifase, gestisce più dispositivi modbus contemporaneamente e ha una gestione più snella e efficiente.
Oltre alla lettura di uno o più contatori e di altri dispositivi modbus, il programma permette di effettuare altre operazioni sulle misurazioni (utili per esempio per conversioni o quando si cambia un contatore).
Nei file allegati a questo post oltre al programma troverete anche alcuni script di supporto che in seguito vi spiego come usare.
I file tar vanno copiati nella directory /var/www/comapps.
I file vanno scompattati utilizzando il comando tar. Per esempio per scompattare il file monitor.tar va usato il comando
Codice: Seleziona tutto
tar xvf monitor.tar
Il contenuto del file monitor.tar è il seguente:
Codice: Seleziona tutto
monitor
monitor.conf.sample
Il contenuto del file comapps.tar è il seguente:
Codice: Seleziona tutto
com_daemon_loop.php
com_daemon.php
pooler.php
reqsubmet.php
monitor è il programma vero e proprio;
monitor.conf.sample è un esempio, adeguatamente documentato, del relativo file di configurazione;
com_daemon_loop.php e com_daemon.php sono i programmi di JM modificati nella parte di esecuzione di monitor;
pooler.php è il sostituto di poolerconsumi ed è il plugin che permette a meterN di leggere i dati dal contatore;
reqsubmet.php è lo script che permette di leggere dentro meterN i dati meterN (principalmente per la configurazione degli indicatori).
Una volta scompattati i file tar, come prima cosa, bisogna dare i seguenti comandi:
Codice: Seleziona tutto
sudo -s
cp monitor /usr/bin/monitor
cp monitor.conf.sample monitor.conf
chmod 4711 /usr/bin/monitor
chmod +x /var/www/comapps/*
chown www-data.www-data /var/www/comapps/*
ln -s /var/www/comapps/pooler.php /usr/bin/pooler
ln -s /var/www/comapps/reqsubmet.php /usr/bin/reqsubmet
Configurazione sensori
A questo punto va editato il file monitor.conf e adattato alla propria configurazione: probabilmente basta intervenire su pochi parametri. Sicuramente va controllato/modificato il parametro relativo all'indirizzo del contatore (Address), il parametro OutFile ed, eventualmente, il parametro Port1Dev.
Se si dispone di più contatori da leggere basta duplicare la sezione [Sensor1] per ogni contatore che si possiede rinominando la sezione in [Sensor2], [Sensor3], ecc. ovviamente modificando l'indirizzo (parametro Address) e l'output (parametro OutFile).
La cosa importante quando si creano più sezioni relative ai sensori è che le sezioni devono essere numerate in sequenza. Non è possibile avere duplicazioni o buchi nella numerazione (per esempio [Sensor1], [Sensor2], [Sensor2], [Sensor4]). L'ordine con cui sono scritti nel file di configurazione, invece, non è importante.
Configurazione MQTT
Particolare attenzione va dedicata alle impostazioni di configurazione dei parametri relativi al broker MQTT. I vari parametri sono descritti nel file di configurazione. Qui faccio solo alcune precisazioni.
Il parametro useMQTT indica se il programma deve pubblicare i dati su un topic del broker MQTT. I valori ammessi sono yes e no. Se useMQTT viene impostato a no tutti gli altri parametri vengono ignorati.
Se il parametro MQTTusername viene lasciato bianco allora il sistema non userà l'autenticazione e il successivo parametro MQTTpassword viene ignorato.
La versione attuale del programma non gestisce la comunicazione crittografata (la implementerò dopo che sono certo che tutto funziona per il meglio).
Se non presenti nel sistema vanno installate le librerie libmodbus e libmosquitto.
La libreria libmodbus si installa con il comando
Codice: Seleziona tutto
sudo apt-get install libmodbus-dev
La libreria libmosquitto si installa con il comando
Codice: Seleziona tutto
sudo apt-get install libmosquitto1 libmosquitto-dev
Test di funzionamento
A questo punto si può provare se tutto funziona con il comando:
Codice: Seleziona tutto
./monitor
Se tutto è configurato bene il programma dovrebbe generare dentro /dev/shm un file con i dati letti dal contatore ovvero dai contatori.
Nel caso in cui il parametro ID è stato posto a 2 e il parametro OufFile è impostato a /dev/shm/metern2.txt, con il comando cat /dev/shm/metern2.txt visioniamo il file che, in caso di SMD120/220/230 ha una struttura simile a questa:
Codice: Seleziona tutto
2_V(235.44*V)
2_C(0.37*A)
2_P(57.76*W)
2_AP(87.14*VA)
2_RP(-65.25*VAR)
2_PF(0.66*F)
2_PA(-48.49*°)
2_F(50.01*Hz)
2_IE(366672*Wh)
2_EE(0*Wh)
2_TE(366672*Wh)
2_IRE(464*VARh)
2_ERE(167592*VARh)
2_TRE(168056*VARh)
mentre per un SDM630 la struttura è simile a questa:
Codice: Seleziona tutto
2_VR(231.95*V)
2_VS(0.00*V)
2_VT(0.00*V)
2_PR(505.59*W)
2_PS(0.00*W)
2_PT(0.00*W)
2_APR(672.62*VA)
2_APS(0.00*VA)
2_APT(0.00*VA)
2_RPR(-418.29*VAR)
2_RPS(0.00*VAR)
2_RPT(0.00*VAR)
2_PFR(0.78*)
2_PFS(0.00*)
2_PFT(0.00*)
2_PAR(-38.46*Dg)
2_PAS(0.00*Dg)
2_PAT(0.00*Dg)
2_AVN(0.00*V)
2_ALC(0.00*A)
2_SLC(0.00*A)
2_TP(0.00*W)
2_TAP(0.00*Hz)
2_TRP(0.00*Hz)
2_TPF(0.00*)
2_TPA(0.00*Dg)
2_F(50.02*Hz)
2_IE(1142*Wh)
2_EE(0*Wh)
2_RIE(0*Wh)
2_REE(1006*Wh)
2_VRS(0.00*V)
2_VST(0.00*V)
2_VTR(0.00*V)
2_AVLL(0.00*V)
2_NC(0.00*V)
2_TE(1142256*Wh)
2_TRE(1006515*VARh)
La spiegazione dei vari simboli si trova nel file monitor.conf dove ho indicato il dettaglio di tutti i parametri letti e trattati dal programma per ogni dispositivo che il programma stesso è in grado di leggere.
Tale dettaglio è utile per la configurazione di meterN e per l'interfacciamento di altri software tramite il broker MQTT.
Topic MQTT
Al tal riguardo faccio presente che l'effettivo topic su cui viene pubblicato il dato è quello che si ottiene dall'unione di quanto specificato in MQTTtopic e della desinenza del relativo sottoparametro.
Mi spiego meglio.
Supponiamo che abbiamo configurato nella sezione [Sensor1] un contatore SDM220 e abbiamo impostato
Codice: Seleziona tutto
MQTTtopic = casa/energia/consumi
Il valore della tensione letta dal contatore viene pubblicato sul topic casa/energia/consumi/V mentre la corrente viene pubblicata sul topic casa/energia/consumi/C. E così via.
Configurazione MeterN
Se la precedente prova è andata a buon fine si può procedere con la configurazione di meterN.
Per prima cosa mettete in stop meterN e andate nella pagina di configurazione dei misuratori.
Questo è un esempio di come va configurato il meter Consumi supponendo che sia il meter 2 e che sia rilevato da un SDM120/220/230.
Misuratore consumi
Codice: Seleziona tutto
Name: Consumi
Type: Elec - House consumption
MeterID: solitamente 2_IE altrimenti adatta qui e dopo.
Command: pooler 2 IE energy
MeterID live pooling: 2_P
Mode: value
Live command: pooler 2 P power
Per la configurazione degli indicatori si userà invece lo script reqsubmet.
Indicatore tensione
Codice: Seleziona tutto
Name: Tensione
ID: 2_V
Mode: value
Command: reqsubmet 2 V
Unit: V
Se volessimo la corrente..
Indicatore Corrente
Codice: Seleziona tutto
Name: Corrente
ID: 2_C
Mode: value
Command: reqsubmet 2 C
Unit: A
E così via...
Struttura del file di configurazione monitor.conf
Per completezza guardiamo un pò più in dettaglio la struttura del file di configurazione e il significato delle varie voci.
Il file di configurazione è strutturato in sezioni:
- una sezione di carattere generale denominata [General]
- e tante sezioni relative ai sensori (una per ogni sensore) denominata [SensorXX] (con XX numero intero progressivo.
Le sezioni relative ai sensori devono essere denominate [Sensor1], [Sensor2], [Sensor3], ecc.. Cioè la parola Sensor seguito da un numero progressivo.
Il programma conterà le sezioni per "capire" quanti sensori deve interrogare. Non è possibile creare buchi nella numerazione ([Sensor1] e [Sensor4]) ma la numerazione delle sezioni deve essere consecutiva e non sono ammessi duplicazioni di sezioni.
Il programma gestisce 4 tipi di sensori (in realtà 5 ma il quinto è un termometro che ho realizzato io per me e quindi non pubblico):
- i contatori monofase e trifase eastron più diffusi (SDM 120, 220, 230, 630 modbus)
- un sensore generico modbus (utile se si deve collegare a meterN un contatore con l'uscita modbus o dei dispositivi di input).
Per quanto riguarda i contatori Eastron i parametri da inserire nella sezione [SensorXX] sono:
Codice: Seleziona tutto
Name --> Semplice descrizione;
Type --> ; 1 per SDM120, 2 per SDM220/SDM230 e 3 per SDM630;
Port --> Indica il numero della porta di comunicazione (per come definita nella sezione generale) cui è connesso il sensore: valori ammessi 1 o 2;
Address --> Indirizzo modbus del sensore;
Delay --> Intervallo di tempo fra due richieste sul bus modbus in caso di errore;
ID --> Indica l'ID del sensore (per esempio meterID in meterN);
OutputType --> Indica come il programma deve produrre i dati: 1 per il formato 123solar, 2 per il formato MeterN e 3 per un formato descrittivo esteso;
OutFile --> è il path completo del file (per esempio in meterN /dev/shm/metern2.txt);
MQTTtopic --> è il topic base dove vengono eventualmente pubblicati i parametri letti dal dispositivo;
NumOp --> Indica il numero di operazioni da fare sui dati letti dal sensore prima della scrittura nel file: se si indica 0 vuol dire che non vanno fatte operazioni;
Nel caso in cui il campo NumOp è maggiore di 1 vanno inserite tante triplette ParY, CY e OpY per descrivere l'operazione da effettuare.
Codice: Seleziona tutto
ParY --> Indica l'ordinale del valore da modificare (per esempio posto pari a 9 per un sensore SDM220 permette di modificare il valore dell'energia prelevata);
CY --> è il valore che viene usato per l'operazione di correzione;
OpY --> è il simbolo dell'operazione da compiere (+, -, *, /);
Pertanto se cambiamo il contatore e vogliamo mantenere dentro meterN una continuità dei valori nell'archivio è necessario sommare al valore letto l'ultimo valore indicato dal vecchio contatore. Se il vecchio contatore indicava 12456 allora dobbiamo settare i parametri così:
Codice: Seleziona tutto
NumOp = 1
Par1 = 9
C1 = 12345
Op1 = +
Il sensore generico (Tupe = 20) ha 3 ulteriori parametri:
Codice: Seleziona tutto
Register --> Numero del primo registro da leggere
NumReg --> Numero di registri da leggere
RegType --> Tipo di registro da leggere (I = Input Register o H = Holding Register)
Monitor con 123Solar
Allegato a questo post trovate anche i file per 123solar (monitor_protocol) in modo da poter usare monitor anche con 123solar.
I file vanno messi in /var/www/123solar/scripts/protocols con proprietario www-data e permessi 644
Dalla sezione admin di 123solar scegliete come protocol "monitor" e come indirizzo il numero del meterID di meterN.
Con questo potete eliminare tranquillamente pool123s in meterN.
Ciao
G.