SCRIPT PYTHON PER MANTENERE I GRAFICI A POSTO DOPO IL RIAVVIO DI RASPBERRY

Discussioni relative al software di monitoraggio energetico METERN
fabioe
Messaggi: 29
Iscritto il: 22/01/2016, 21:03

SCRIPT PYTHON PER MANTENERE I GRAFICI A POSTO DOPO IL RIAVVIO DI RASPBERRY

Messaggioda fabioe » 28/03/2019, 19:59

Come da titolo ...
Ho adattato per questo scopo un file python che ha preparato un mio collega per mettere a punto un parametro per il monitoraggio della PDC all' interno di meterN.

Legge ultimi valori scritti da metern nell' ultima riga del file.csv più recente e li riscrive nei corrispondenti file in /dev/shm/
Al riavvio del raspberry, metern si trova nei file dei vari meter l' ultimo valore che era stato trascritto nel file.csv del giorno, e quindi i grafici hanno continuità con i valori precedenti.
Testato e funzionante con contatore di produzione dedicato (non uso aurora).

Lo posto come lo sto usando sul mio sistema che in totale è arrivato a 38 meter :D
Va adattato alla propria configurazione di meterN.
Va messo in /usr/local/bin/ e messo in avvio automatico con systemctl creando un nuovo servizio che lo invoca.

Codice: Seleziona tutto

#!/usr/bin/python
#
# Legge dati da ultimo file .CSV presente in   /var/www/metern/data/csv/   generato da Metern
# Scrive ultimi valori in 15 file presenti in   /dev/shm   dei corrispettivi meter, al riavvio raspberry
# Va editato in base ai meter esistenti nella propria configurazione di metern
# Va posto in   /usr/local/bin/   e messo in esecuzione automatica con "systemctl"
# creando un nuovo servizio in   /etc/systemd/system/

# Questa operazione mantiene continuita con i grafici esistenti prima del riavvio del sistema
# evitando che si debbamo aspettare 24 ore per il riallineamento

# Editato da Giovanni Turchi
# e "adattato" da Fabio Brera

import time, sys, csv, os, glob
from collections import deque


pathcsv = '/var/www/metern/data/csv/'

oCode1   = '1'         # numero del meter in metern
oCode2   = '2'
oCode6   = '6'
oCode7   = '7'
oCode8   = '8'
oCode13   = '13'
oCode14   = '14'
oCode15   = '15'
oCode30   = '30'
oCode33   = '33'
oCode34   = '34'
oCode35   = '35'
oCode36   = '36'
oCode37   = '37'
oCode38   = '38'
unit   = 'Wh'
unitcop   = 'P'
name1   = 'produzione'  # nome del meter in metern
name2   = 'consumi'
name6   = 'consumi'
name7   = 'consumi'
name8   = 'consumi'
name13   = 'whcaparisc'
name14   = 'whcapraffr'
name15   = 'whcapacs'
name30   = 'whterm'
name33   = 'whtermrisc'
name34   = 'whtermraffr'
name35   = 'whtermacs'
name36    = 'copglobrisc'
name37    = 'copglobraf'
name38    = 'copglobacs'
path_wr   = '/dev/shm/'
fileout1 = path_wr+name1+oCode1+'.txt'
fileout2 = path_wr+name2+oCode2+'.txt'
fileout6 = path_wr+name6+oCode6+'.txt'
fileout7 = path_wr+name7+oCode7+'.txt'
fileout8 = path_wr+name8+oCode8+'.txt'
fileout13 = path_wr+name13+oCode13+'.txt'
fileout14 = path_wr+name14+oCode14+'.txt'
fileout15 = path_wr+name15+oCode15+'.txt'
fileout30 = path_wr+name30+oCode30+'.txt'
fileout33 = path_wr+name33+oCode33+'.txt'
fileout34 = path_wr+name34+oCode34+'.txt'
fileout35 = path_wr+name35+oCode35+'.txt'
fileout36 = path_wr+name36+oCode36+'.txt'
fileout37 = path_wr+name37+oCode37+'.txt'
fileout38 = path_wr+name38+oCode38+'.txt'

# troviamo il file piu' recente
newest = max(glob.iglob(pathcsv+'*.csv'), key=os.path.getctime)
# print newest
with open (newest) as csvfile:
   reader = csv.DictReader(csvfile)
   for row in reader:   
      pro_ftv = row['Produzione(Wh)']      # da editare con nome intero presente
      con_tot = row['Consumi(Wh)']      # nella corrispettiva colonna nel file .csv
      pdc_tot = row['PDC(Wh)']
      ind_tot = row['INDUZIONE(Wh)']
      ext_tot = row['Extra(Wh)']
      pdc_ris = row['PDC riscald(Wh)']
      pdc_raf = row['PDC raffr(Wh)']
      pdc_acs = row['PDC acs(Wh)']
      ene_ter = row['POT term(Wh)']
      ter_ris = row['E term Risc(Wh)']
      ter_raf = row['E term Raffr(Wh)']
      ter_acs = row['E term ACS(Wh)']
      cop_dris = row['COP day-risc(P)']
      cop_draf = row['COP day-raffr(P)']
      cop_dacs = row['COP day-acs(P)']

   #print(row['Time'], pro_ftv, con_tot, pdc_tot, ind_tot, ext_tot, pdc_ris, pdc_raf, pdc_acs)
   #print(row['Time'], ene_ter, ter_ris, ter_raf, ter_acs, cop_dris, cop_draf, cop_dacs)

formatted1=oCode1+'('+str(pro_ftv)+'*'+unit+')'
formatted2=oCode2+'('+str(con_tot)+'*'+unit+')'
formatted6=oCode6+'('+str(con_tot)+'*'+unit+')'
formatted7=oCode7+'('+str(con_tot)+'*'+unit+')'
formatted8=oCode8+'('+str(con_tot)+'*'+unit+')'
formatted13=oCode13+'('+str(pdc_ris)+'*'+unit+')'
formatted14=oCode14+'('+str(pdc_raf)+'*'+unit+')'
formatted15=oCode15+'('+str(pdc_acs)+'*'+unit+')'
formatted30=oCode30+'('+str(ene_ter)+'*'+unit+')'
formatted33=oCode33+'('+str(ter_ris)+'*'+unit+')'
formatted34=oCode34+'('+str(ter_raf)+'*'+unit+')'
formatted35=oCode35+'('+str(ter_acs)+'*'+unit+')'
formatted36=oCode36+'('+str(cop_dris)+'*'+unitcop+')'
formatted37=oCode37+'('+str(cop_draf)+'*'+unitcop+')'
formatted38=oCode38+'('+str(cop_dacs)+'*'+unitcop+')'
out_file = open(fileout1,"w")
out_file.write(formatted1)
out_file.close()
os.chmod(fileout1,0666)         # riporta i permessi a livello che consenta agli script in comapps di
out_file = open(fileout2,"w")      # scrivere i file nel caso questo script sia stato eseguito come root
out_file.write(formatted2)      
out_file.close()
os.chmod(fileout2,0666)
out_file = open(fileout6,"w")
out_file.write(formatted6)
out_file.close()
os.chmod(fileout6,0666)
out_file = open(fileout7,"w")
out_file.write(formatted7)
out_file.close()
os.chmod(fileout7,0666)
out_file = open(fileout8,"w")
out_file.write(formatted8)
out_file.close()
os.chmod(fileout8,0666)
out_file = open(fileout13,"w")
out_file.write(formatted13)
out_file.close()
out_file = open(fileout14,"w")
out_file.write(formatted14)
out_file.close()
out_file = open(fileout15,"w")
out_file.write(formatted15)
out_file.close()
out_file = open(fileout30,"w")
out_file.write(formatted30)
out_file.close()
out_file = open(fileout33,"w")
out_file.write(formatted33)
out_file.close()
out_file = open(fileout34,"w")
out_file.write(formatted34)
out_file.close()
out_file = open(fileout35,"w")
out_file.write(formatted35)
out_file.close()
out_file = open(fileout36,"w")
out_file.write(formatted36)
out_file.close()
out_file = open(fileout37,"w")
out_file.write(formatted37)
out_file.close()
out_file = open(fileout38,"w")
out_file.write(formatted38)
out_file.close()
#print formatted
# quit()
#sys.exit()

Immagine


Avatar utente
Flane
Messaggi: 2463
Iscritto il: 16/01/2016, 15:02

Re: SCRIPT PYTHON PER MANTENERE I GRAFICI A POSTO DOPO IL RIAVVIO DI RASPBERRY

Messaggioda Flane » 01/04/2019, 18:19

Hai messo parecchio sotto stress il sistema con 38 meter... ;)

Scusa ma all'avvio di MeterN dovrebbe partire anche il pooler485 (tramite configdaemon) che legge i contatori e scrive i relativi file temporanei in /dev/shm.

Non ho capito il motivo per cui hai dovuto fare questo ulteriore script.
Io non ho molti meter ma non ho bisogno di questo script, posso riavviare quanto e quando voglio e tutto riparte sempre regolarmente..... :?

fabioe
Messaggi: 29
Iscritto il: 22/01/2016, 21:03

Re: SCRIPT PYTHON PER MANTENERE I GRAFICI A POSTO DOPO IL RIAVVIO DI RASPBERRY

Messaggioda fabioe » 02/04/2019, 14:43

Eh si ....sistema abbastanza carico ! :D
Lo script l' ho messo a punto per due motivi:

1) In fondo alla lista dei meters ci sono anche dei contatori di energia termica sviluppata dalla PDC e altri di energia elettrica (parziale) ricavati dagli sdm nei momenti di funzionamento per produzione ACS e RISCALDAMENTO separati.
Questi mi servono per calcolare il COP della PDC.
Essendo questi contatori (non fisici) ma ricavati con altro script che integra la potenza nel tempo per arrivare ai Wh, ad ogni riavvio del raspberry i valori nei file dei meter (non fisici) si azzerano e quindi si perde continuità nei grafici e nello storico delle letture.
Con questo script si riparte sempre dall' ultimo valore scritto nel file .csv più recente.
Idem per i meters con i valori di COP della PDC.

2) Nella immagine solar-strecht configurata con 5 contatori fisici SDM e virtmet per calcolo autoconsumo/immissione/prelievo, al riavvio avevo sempre discontinuità anche nei grafici di produzione e prelievo, e quindi anche virtmet produceva dati sballati.
Potrebbe essere colpa del numero dei contatori ... ? Il pooler impiega più tempo per la lettura e di conseguenza non scrive in tempo i file dei relativi meters e la prima lettura di metern è fatta su un file vuoto ?

Con lo script sono riuscito a risolvere il problema.
Certo se qualcuno ha medesimo problema e vuole usare questo script, come dicevo va alleggerito dei meters non necessari e adattato con numeri e nomi assegnati ai meters in metern che sono gli stessi che compaiono nella prima riga del file .csv.


Torna a “MeterN”

Chi c’è in linea

Visitano il forum: Nessuno e 13 ospiti