Script per monitorare blackout e sbalzi di tensione

Discussioni relative al software di monitoraggio energetico METERN
Avatar utente
amorospo
Messaggi: 61
Iscritto il: 20/01/2016, 15:44

Script per monitorare blackout e sbalzi di tensione

Messaggioda amorospo » 04/02/2017, 23:23

Ho scritto un piccolo script in python per monitorare la tensione ed avvisarmi via email di:
    blackout
    tensione minore della soglia impostata
    tensione maggiore della soglia impostata
Per poterlo usare non occorre installare null'altro oltre alla solarjessie 2.6.
Come per lo script di controllo del display lcd di cui parlo nell'altro 3d anche questo non scrive, nè elabora alcun comando, ma si limita a leggere i file già creati da metern nella directory /run/shm. Così facendo non influisce minimamente sulle prestazioni di metern/123solar.

N.B. le info riportate qui di seguito sono state riaggiornate e riportate riviste e corrette nel post n.12.

Qui trovate il file: VoltageControl

Per poterlo usare occorre editare i parametri all'inizio del file, seguendo i commenti presenti. Niente di particolarmente complicato.
Il file è impostato per l'invio da una casella gmail a due caselle qualunque, ma tutto può essere variato a piacimento.

Ovviamente per permettere il monitoraggio ANCHE durante i blackout, il raspi ed il router devono essere sotto UPS.

Per installare lo script:

sudo -s
cd /var/www/MyScripts
wget https://www.dropbox.com/s/pcutzbs0qxe5s ... RL.py?dl=0
chmod 755 VoltCTRL.py


Per poter poi avviare lo script all'avvio del raspi occorre creare il relativo servizio. Così:

sudo -s
cd /etc/systemd/system/
nano VoltCtrl.service


compilare il file esattamente così:

Codice: Seleziona tutto

[Unit]
Description=Voltage monitoring email warnings
After=network.target metern.service

[Service]
Type=simple
ExecStart=/var/www/MyScripts/VoltCTRL.py

[Install]
WantedBy=multi-user.target


ctrl+o per salvare, ctrl+x per uscire

Per abilitare il servizio:

sudo systemctl enable VoltCtrl


Per avviare il servizio all'avvio del raspi:

sudo systemctl start VoltCtrl

Riavvio il raspi

shutdown -r now


Finito.
Ora ogni volta che ci sarà uno sbalzo di tensione, oppure un blackout riceverete un'email di avviso. Così anche al ripristino della corretta tensione.
Di default è impostato il controllo ogni 30 secondi.
Le soglie preimpostate per l'avvio dei messaggi di allarme sono:
1 V per blackout
215 V tensione troppo bassa
245 V tensione troppo alta

Edit: Fatte alcune correzioni come da post successivi
Ultima modifica di amorospo il 13/02/2017, 11:23, modificato 7 volte in totale.


Avatar utente
amorospo
Messaggi: 61
Iscritto il: 20/01/2016, 15:44

Re: Script per monitorare blackout e sbalzi di tensione

Messaggioda amorospo » 04/02/2017, 23:25

Incollo qui lo script per esteso solo per presa visione. Conviene scaricare il file al post precedente perchè qui nel forum si perdono le indentazioni del codice, che in python sono fondamentali.

Codice: Seleziona tutto

#!/usr/bin/python

# Power outage and surges alarm system

####################################################################################
#### Author: Alessandro Botta - amorospo@yahoo.it            ####
####################################################################################

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import linecache
import time
import os

def send_msg():
        server = smtplib.SMTP(smtp_S, smtp_P)   
        server.ehlo()
        server.starttls()
        server.login(from_addr, pwd)
        msg = MIMEMultipart()
        msg['From'] = from_addr
        msg['To'] = to_addrs
        msg['Subject'] = msg_sbj             
        msg.attach(MIMEText(msg_obj))
        time.sleep(1)
        server.sendmail(from_addr, to_addrs.split(','), msg.as_string())
        server.quit()
        time.sleep(lapse)                                 

def chk():
        linecache.checkcache(Volt)

self_file = os.path.realpath(__file__)

##########################################################################
##########################################################################
######## Data setting - MUST BE EDITED TO MAKE THE SCRIPT WORKING ########
##########################################################################
##########################################################################
Volt = "/dev/shm/metern2.txt"         #SDM Voltage metern file
met_V = "2_1"               #SDM Voltage metern ID
smtp_S = 'smtp.gmail.com'         #Set your smtp server
smtp_P = 587               #Set your smtp server port
from_addr = "YOUR_SENDING_ADDRESS@EMAIL.COM"    #Your gmail account you use to send email FROM
pwd = "YOUR_SENDING_ADDRESS_PASSWORD"      #Your gmail account password     
to_addrs = 'FIRST_RECIPIENT@EMAIL.COM,SECOND_RECIPIENT@EMAIL.COM,and so on' #Email accounts you use to receive email TO ### (Use , to separate email accounts)
BlackOut = 1               #Input Min voltage for power outage alarm routine start
LowV = 215               #Input voltage value for low voltage alarm routine start
HiV = 245               #Input voltage value for high voltage alarm routine start
lapse = 30               #Set checking lapse in seconds (Min 30 secs to avoid sending email errors)
##########################################################################
##########################################################################
##########################################################################

#Let MeterN write first data
time.sleep(10)
file_V = linecache.getline(Volt,3)

# Begin loop
while file_V.startswith(met_V) is True:

   # Reading files and data
        Volt_num = float((linecache.getline(Volt,3)).replace((''.join([met_V,"("]))," ").replace("*V)"," ").strip())
   time.sleep(1)
        chk()
        time.sleep(1)

   #Routine in case of POWER OUTAGE
   if Volt_num <= BlackOut:
           msg_sbj = 'POWER OUTAGE WARNING!!!'      #Email subject
                msg_obj = ('Warning! Power is down. Voltage is now: {0:0.1f} Volt'.format(Volt_num))   #Email text
      send_msg()
      while True:
         if Volt_num <= BlackOut:
                           time.sleep(5)
                 Volt_num = float((linecache.getline(Volt,3)).replace((''.join([met_V,"("]))," ").replace("*V)"," ").strip())
            chk()
         else:
            #routine Power Outage end
            if Volt_num < HiV and Volt_num > LowV:   
                    msg_sbj = 'POWER OUTAGE ENDS'      #Email subject
                         msg_obj = ('Alarm ends. Power is up! Voltage is now: {0:0.1f} Volt'.format(Volt_num))   #Email text
               send_msg()
               break
            else:
               time.sleep(2)
                    Volt_num = float((linecache.getline(Volt,3)).replace((''.join([met_V,"("]))," ").replace("*V)"," ").strip())
               chk()
                                   break

   #routine Low voltage alarm
   elif Volt_num > BlackOut and Volt_num <= LowV:   
           msg_sbj = 'Voltage anomaly'         #Email subject
                msg_obj = ('Warning! Voltage is too low : {0:0.1f} Volt'.format(Volt_num))   #Email text
      send_msg()
      while True:
                 if Volt_num > BlackOut and Volt_num <= LowV:            
                      time.sleep(5)
                 Volt_num = float((linecache.getline(Volt,3)).replace((''.join([met_V,"("]))," ").replace("*V)"," ").strip())
            chk()
                        else:   
            #routine Low voltage alarm end
            if Volt_num < HiV and Volt_num > LowV:
                                  msg_sbj = 'Voltage anomaly ends'      #Email subject
                                        msg_obj = ('Anomaly ends. Voltage is OK: {0:0.1f} Volt'.format(Volt_num))   #Email text
               send_msg()
                                         break
            else:
               time.sleep(2)
                    Volt_num = float((linecache.getline(Volt,3)).replace((''.join([met_V,"("]))," ").replace("*V)"," ").strip())
               chk()
                                        break

   #routine High voltage alarm
   elif Volt_num >= HiV:
           msg_sbj = 'Voltage anomaly'         #Email subject
                msg_obj = ('Warning! Voltage is too high: {0:0.1f} Volt'.format(Volt_num))   #Email text
      send_msg()
      while True:
           if Volt_num >= HiV:
            time.sleep(5)
                 Volt_num = float((linecache.getline(Volt,3)).replace((''.join([met_V,"("]))," ").replace("*V)"," ").strip())
            chk()
                        else:
            #routine High voltage alarm end
            if Volt_num < HiV and Volt_num > LowV:   
                                   msg_sbj = 'Voltage anomaly ends'      #Email subject
                                       msg_obj = ('Anomaly ends. Voltage is OK: {0:0.1f} Volt'.format(Volt_num))   #Email text
               send_msg()
                                         break
            else:
               time.sleep(2)
                    Volt_num = float((linecache.getline(Volt,3)).replace((''.join([met_V,"("]))," ").replace("*V)"," ").strip())
               chk()
                                   break

   #Routine normal Voltage
   else:   
      time.sleep(lapse)
           Volt_num = float((linecache.getline(Volt,3)).replace((''.join([met_V,"("]))," ").replace("*V)"," ").strip())
      chk()

#Routine reading file error
else:   
   msg_sbj = 'Voltage control fatal error'                #Email subject
        msg_obj = ('Error reading file %s. No usuful data to process' % (Volt))       #Email text
        send_msg()
   while True:
      if file_V.startswith(met_V) is False:   
         file_V = linecache.getline(Volt,3)
         chk()
             time.sleep(5)
      else:
         execfile(self_file)
Ultima modifica di amorospo il 08/02/2017, 13:51, modificato 6 volte in totale.

Avatar utente
Walter62
Messaggi: 284
Iscritto il: 19/01/2016, 19:18

Re: Script per monitorare blackout e sbalzi di tensione

Messaggioda Walter62 » 05/02/2017, 7:45

Ciao, il servizio sarebbe meglio impostarlo per avviarsi dopo 123solar e meterN visto che prende i dati da loro, per evitare che nelle fasi di avvio non trovi alcun dato da leggere.
L'invio di mail per superamento della soglia minima e massima di tensione è già gestito da 123solar, quindi sarebbe meglio evitare doppi script che fanno la stessa cosa per non appesantire inutilmente il sistema.
Per quanto riguarda la segnalazione di black-out sia il tuo script che 123solar soffrono di un problema intrinseco che non è dovuto al software ma all'hardware, se manca la tensione il raspberry e/o il router si spengono e quindi non sarà possibile inviare mail, in alternativa bisognerebbe mettere sotto batteria tampone sia il raspberry che il router.
Per baypassare questo problema ho preferito appoggiarmi a PVOutput che ha una funzione integrata di invio mail se per 15 minuti non riceve dati, chiaramente se il mio sistema non invia dati o c'è un black-out o il sistema è anadato in blocco.

In ogni caso bel lavoro, è sempre bello e interessante vedere che qualcuno si impegna a fare qualcosa per risolvere dei problemi e poi lo condivide con la comunità. Continua così Grazie
Sito personale: walter62.altervista.org

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

Re: Script per monitorare blackout e sbalzi di tensione

Messaggioda Flane » 05/02/2017, 11:18

Un ottimo lavoro amorospo.

Come ha già fatto notare Walter alcuni allarmi sono già integrati in 123solar (anche se a dire il vero dovrebbero essere funzionanti solo nelle ore diurne in cui 123solar è attivo):
123solar_alarm.JPG

Rimane comunque un ottimo lavoro e grazie per averlo condiviso ;)


Una piccola correzione:

Nelle ultime versioni di MeterN, la cartella temporanea in cui metern salva i dati è /dev/shm e non /run/shm, anche se in realtà è presente un symlink che collega i due path. E' comunque meglio usare l'indirizzo diretto /dev/shm

Avatar utente
amorospo
Messaggi: 61
Iscritto il: 20/01/2016, 15:44

Re: Script per monitorare blackout e sbalzi di tensione

Messaggioda amorospo » 05/02/2017, 12:03

Walter62 ha scritto:Ciao, il servizio sarebbe meglio impostarlo per avviarsi dopo 123solar e meterN visto che prende i dati da loro, per evitare che nelle fasi di avvio non trovi alcun dato da leggere.


Ci avevo pensato, però mi stavo ancora informando su come fare.
Lo script comunque anche se non trova dati non va in blocco, ma continua ad eseguirsi finchè trova qualche dato.
Per avviarlo dopo meterN basta modificare il service così:

Codice: Seleziona tutto

[Unit]
Description=Voltage monitoring email warnings
After=network.target
After=metern.target

[Service]
Type=simple
ExecStart=/home/pi/VoltCTRL.py

[Install]
WantedBy=multi-user.target


Giusto?

Walter62 ha scritto:L'invio di mail per superamento della soglia minima e massima di tensione è già gestito da 123solar, quindi sarebbe meglio evitare doppi script che fanno la stessa cosa per non appesantire inutilmente il sistema.


Già, però come dice anche Flane sopra gli avvisi dovrebbero funzionare solo durante il giorno. Inoltre, mi son dimenticato di dirlo, io ho pensato lo script per farlo funzionare nella mia casa di campagna, dove non ho fotovoltaico e 123solar, ma solo metern attivo per monitorare consumi e sensori vari.

Walter62 ha scritto:Per quanto riguarda la segnalazione di black-out sia il tuo script che 123solar soffrono di un problema intrinseco che non è dovuto al software ma all'hardware, se manca la tensione il raspberry e/o il router si spengono e quindi non sarà possibile inviare mail, in alternativa bisognerebbe mettere sotto batteria tampone sia il raspberry che il router.


Vero, infatti l'ho scritto anche io. Certo mi pare un po' un controsenso mettere in pista un signor monitoraggio con metern, 123solar e tutte le feature di cui discutiamo qui, lasciando router e raspi in balia dei capricci delle nostra rete elettrica, quando con un ups entrylevel anche usato (oppure sistemi a batteria per raspi) da pochi euro ci garantiamo una minima protezione molto utile per evitare guai ben peggiori dell'interrompere il monitoraggio per un blackout.

Walter62 ha scritto:Per baypassare questo problema ho preferito appoggiarmi a PVOutput che ha una funzione integrata di invio mail se per 15 minuti non riceve dati, chiaramente se il mio sistema non invia dati o c'è un black-out o il sistema è anadato in blocco.


Soluzione non applicabile se sul raspi non gira 123solar, come detto sopra.

Walter62 ha scritto:In ogni caso bel lavoro, è sempre bello e interessante vedere che qualcuno si impegna a fare qualcosa per risolvere dei problemi e poi lo condivide con la comunità. Continua così Grazie


Grazie mille.
Tra l'altro lo script in questo caso monitora la tensione di rete, ma con quattro modifiche in croce potrebbe monitorare anche l'assorbimento o il cosphi nella stessa maniera, avvisando in caso di anomalie.
Oppure sempre con pochi adattamenti può inviare notifiche in base al comportamento di alcuni sensori itpo temperatura, pressione, ecc.


Flane ha scritto:Un ottimo lavoro amorospo.

Come ha già fatto notare Walter alcuni allarmi sono già integrati in 123solar (anche se a dire il vero dovrebbero essere funzionanti solo nelle ore diurne in cui 123solar è attivo):
123solar_alarm.JPG

Rimane comunque un ottimo lavoro e grazie per averlo condiviso ;)


Grazie anche a te.

Flane ha scritto:Una piccola correzione:

Nelle ultime versioni di MeterN, la cartella temporanea in cui metern salva i dati è /dev/shm e non /run/shm, anche se in realtà è presente un symlink che collega i due path. E' comunque meglio usare l'indirizzo diretto /dev/shm


Ecco, questa cosa mi era sfuggita. Farò la correzione.

Ormai mi è salita sulla spalla la scimmia del python (se penso che 20 giorni fa non ne sapevo praticamente nulla...) e se non mi arrivano presto i componenti che ho ordinato online per finire il mio lcd monitor, devo trovare sfogare la mia voglia di programmazione sulle idee più fantasiose. :D

Avatar utente
Walter62
Messaggi: 284
Iscritto il: 19/01/2016, 19:18

Re: Script per monitorare blackout e sbalzi di tensione

Messaggioda Walter62 » 05/02/2017, 13:45

Nel service devi mettere " after=network.target metern.service"
Sito personale: walter62.altervista.org

Avatar utente
amorospo
Messaggi: 61
Iscritto il: 20/01/2016, 15:44

Re: Script per monitorare blackout e sbalzi di tensione

Messaggioda amorospo » 05/02/2017, 23:04

Ho editato il primo post del 3d con le correzioni proposte:
cambiata la directory di lettura del file
cambiata la directory dello script
modificato il file .service di conseguenza

Avatar utente
amorospo
Messaggi: 61
Iscritto il: 20/01/2016, 15:44

Re: Script per monitorare blackout e sbalzi di tensione

Messaggioda amorospo » 08/02/2017, 13:56

Man mano che imparo qualcosa di nuovo del python metto mano allo script.
Ho ripulito il codice da righe doppie o inutili e l'ho reso più scorrevole.
Ho introdotto alcuni controlli per evitare errori, ed ho eliminato alcune variabili da editare che ho reso automatizzate.
Penso sia la versione definitiva.
Ho editato il primo ed il secondo post con le modifiche del caso.

Avatar utente
Walter62
Messaggi: 284
Iscritto il: 19/01/2016, 19:18

Re: Script per monitorare blackout e sbalzi di tensione

Messaggioda Walter62 » 08/02/2017, 20:49

Se ti stai divertendo, potresti mettere le variabili da editare in un file separato che importi sul principale, così puoi creare anche una semplice GUI per inserire i dati via interfaccia grafica.
PS. Nel service i due after vanno messi in una sola riga, guarda nelle guide per 123solar come si digita quella riga
Sito personale: walter62.altervista.org

Avatar utente
amorospo
Messaggi: 61
Iscritto il: 20/01/2016, 15:44

Re: Script per monitorare blackout e sbalzi di tensione

Messaggioda amorospo » 08/02/2017, 21:38

Walter62 ha scritto:Se ti stai divertendo, potresti mettere le variabili da editare in un file separato che importi sul principale, così puoi creare anche una semplice GUI per inserire i dati via interfaccia grafica.

Mi legge nel pensiero ;) Ci stavo pensando proprio oggi. Tempo permettendo mi ci metterò.
Walter62 ha scritto:PS. Nel service i due after vanno messi in una sola riga, guarda nelle guide per 123solar come si digita quella riga

Ho visto che me li avevi suggeriti su una riga sola, però guardando online parecchi esempi li ho quasi sempre trovati su più righe ed ho pensato fosse lo stesso, senza approfondire l'argomento più di tanto.


Torna a “MeterN”

Chi c’è in linea

Visitano il forum: Nessuno e 81 ospiti