• Benvenuti su RaspberryItaly!
Benvenuto ospite! Login Login con Facebook Registrati Login with Facebook


Valutazione discussione:
  • 0 voto(i) - 0 media
  • 1
  • 2
  • 3
  • 4
  • 5

[-]
Tags
notificatore tramite relè

[Problema] Notificatore tramite relè
#1
Finalmente ho completato il progetto del "notificatore".
Posizionando il Raspy nel quadro elettrico di casa mi notifica via mail e potenzialmente via sms l'interruzione elettrica della linea, il ritorno della linea elettrica, l'avvio dell'irrigazione e lo spegnimento dell'irrigazione.
Il tutto è partito per sapere quando partiva e quando terminava l'irrigazione e poi si è esteso mano a mano.
L'hardware è un raspberry pi3b+ con case corredato di dissipatori e ventola, modulo ups, relè con bobina a 24 e 220v.

Collegamenti:
Da un ground delle gpio vado ai com dei relè, dall'no dei relè vado ai rispettivi ingressi programmati.

La bobina dei relè è collegata in parallelo al carico da monitorare, nel mio caso a fase e neutro del generale quadro e 24v in uscita alla valvola giardino comandata da uno sonoff sv.

Codice:

Codice:
#!/bin/usr/python
# /etc/init.d/notifica.py ###BEGIN INIT INFO
# Provides: notifica.py
# Required-Start:$remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Start daemon at boot time
# Description: Enable service provided by daemon.
### END INIT INFO

from gpiozero import Button
import smtplib
irrigazione = Button(20)
fm = Button(21)

fromaddr = 'raspyluca@gmail.com'
toaddr = 'l.bosca83@gmail.com'
msg = 'subject:monitoraggio avviato'
msg1 = 'subject:irrigazione on'
msg2 = 'subject:irrigazione off'
msg3 ='subject:mancanzafm'
msg4 ='subject:ripristinofm'
username = 'raspyluca@gmail.com'
password = 'XXXXZXXX'
contirr = 0
contfm = 0

#notifica avvio attività
server.starttls()
server.login(username, password)
server.sendmail(fromaddr, toaddr, msg1)
server.quit()

if ( irrigazione.is_pressed and contirr == 0):
server = smtplib.SMTP ('smtp.gmail.com:587')
server.starttls()
server.login(username, password)
server.sendmail(fromaddr, toaddr, msg1)
server.quit()
contirr = contirr + 1
elseif (contirr == 1):
server = smtplib.SMTP ('smtp.gmail.com:587')
server.starttls()
server.login(username, password)
server.sendmail(fromaddr, toaddr, msg2)
server.quit()
contirr = contirr - 1

if ( fm.is_pressed and contfm == 0):
server = smtplib.SMTP ('smtp.gmail.com:587')
server.starttls()
server.login(username, password)
server.sendmail(fromaddr, toaddr, msg3)
server.quit()
contfm = contfm + 1
elseif (contfm == 1):
server = smtplib.SMTP ('smtp.gmail.com:587')
server.starttls()
server.login(username, password)
server.sendmail(fromaddr, toaddr, msg4)
server.quit()
contfm = contfm - 1

Il codice è ancora grezzo ma funziona egregiamente e chiedo il vostro aiuto per poterlo semplificare.
Ad esempio: i contatori li utilizzo per inviare una sola mail al cambio di stato, non cè nella libreria gpiozero un comando del tipo "passato da pressed a released"?

Inviato dal mio SM-A320FL utilizzando Tapatalk
Risposta
#2
la funzione c'è in gpiozero, puoi usare when_released e far partire la notifica solo quando il pulsante viene rilasciato, in modo da essere certo che al sucessivo passaggio il codice non lo trovi premuto evitando così i doppi invii. Oppure con il parametro bounce_time puoi regolare l'antirimbalzo.

io lascerei la parte di invio mail in uno script a parte (esempio notificamail.py) e lo richiamerei quando serve (from notificamail import inviomail - nomi di esempio, dipende da come scrivi il codice), in una logica modulare , orientata agli oggetti e di riutilizzo per progetti futuri.
in realtà, è molto più semplice utilizzare RpyNotify per avere una notifica su Telegram con il minimo del codice.
Risposta
#3
Si, l'ho visto e studiato rpinotify ma dovrei scaricare telegram e farlo scaricare a tutti gli utilizzatori... la mail invece ce l'hanno tutti. Seguendo quanto scritto da te ho pensato una cosa simile:

Codice:
def invia(a):
    server =  smtplib.SMTP ('smtp.gmail.com 587')
    server.starttls()
    server.login(username, password)
    server.sendmail(fromaddr, toaddr,a)
    server.quit()

Fm.when_pressed = invia(msg1)
fm.when_released = invia(msg2)

Così accorcerei il codice e non userei contatori....

Sintatticamente è corretto?

Inviato dal mio SM-A320FL utilizzando Tapatalk
Risposta
#4
sintatticamente è corretto (se è uno spezzone: fm non è definito, le librerie non sono importate.. inoltre hai scritto Fm e fm)
ma intendevo proprio di fare due file .py, uno si occupa di inviare la mail, l'altro richiama una funzione al suo interno (la stessa cosa che fai con le librerie come gpiozero, che di fatto sono uno script .py)
Risposta
#5
Si si, è uno spezzone e le maiuscole è colpa del cel...
Sinceramente per 4 righe di codice non vale neanche la pena creare un altro file.py...
Come torno dalle ferie lo testerò nella nuova versione; tra l'altro impostato così posso sfruttare un singolo gpio come premuto e rilasciato avendo così il doppio degli ingressi disponibili....

Inviato dal mio SM-A320FL utilizzando Tapatalk
Risposta
#6
Ho provato il nuovo codice ma ho fatto un disastro:

Codice:
from gpiozero import Button
import smtplib
irrigazione = Button(20)
fm = Button(21)
fromaddr = 'mailsender'
toaddr = 'mailreceiver'
username = 'user'
password = 'password'

msg = 'subject:monitoraggio avviato'                  
msg1 = 'subject:irrigazione on'
msg2 = 'subject:irrigazione off'
msg3 = 'subject:mancanza corrente'
msg4 = 'subject:corrente ripristinata'

def invia(a):
    server =  smtplib.SMTP ('smtp.gmail.com:587')
    server.starttls()
    server.login(username, password)
    server.sendmail(fromaddr, toaddr,a)
    server.quit()

invia(msg)
while True
    irrigazione.when_pressed = invia(msg1)
    irrigazione.when_released = invia(msg2)
    fm.when_pressed = invia (msg3)
    fm.when_released = invia(msg4)

Il problema è che mi da l'odiato callbacksetToNone... come risolvo?

Inviato dal mio SM-A320FL utilizzando Tapatalk
Risposta
#7
C'è uno spazio di troppo prima della parentesi nella penultima riga

Inviato dal mio A0001 utilizzando Tapatalk
Risposta
#8
Ho corretto il codice ma il risultato non cambia.. Callbacksettonone....

Inviato dal mio SM-A320FL utilizzando Tapatalk
Risposta
#9
while True non ha i due punti.

Sto crollando dal sonno e non ho un raspberry sottomano, comunque prova a
eliminare la riga while True (e relativa identazione delle righe successive)
mettere all' inizio
Codice:
from signal import pause
mettere come ultima riga
Codice:
pause()

comunque l'errore ti dice che non è possibile passare parametri a una funzione di callback
qui c'è la spiegazione
Risposta
#10
Niente da fare, invia msg, poi invia msg3, poi mi da l'errore, poi invia msg4, poi l'errore, poi invia msg1 ed infine invia msg2 il tutto senza aprire/chiudere nessun contatto.
l'errore preciso è
Codice:
/usr/lib/python3/dist-packages/gpiozero/mixins.py:250: CallbackSetToNone: The callback was set to None. This may have been unintentional e.g. btn.when_pressed = pressed() instead of btn.when_pressed = pressed
 warnings.warn(CallbackSetToNone(callback_warning))

il codice che lo genera è
Codice:
#!/bin/usr/python
# /etc/init.d/notifica.py
###BEGIN INIT INFO
# Provides: notifica.py
# Required-Start:$remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description:Start daemon at boot time
# Description: Enable service provided by daemon.
### END INIT INFO

from gpiozero import Button
import smtplib
from signal import pause

fm = Button(21) #controllo fm NO su pin21 NC su pin20
irr = Button(24) #controllo irrigazione NO su pin24 NC su pin23


fromaddr = 'mailmandante'
toaddr = 'mailricevente'
msg = 'subject:monitoraggio avviato'
msg1 = 'subject:irrigazione on'
msg2 = 'subject:irrigazione off'
msg3 = 'subject:corrente ripristinata'
msg4 = 'subject:mancanza corrente'

username = 'user'
password = 'password'

#definizione funzione invio mail
def inviamail(a):
   server = smtplib.SMTP ('smtp.gmail.com:587')
   server.starttls()
   server.login(username, password)
   server.sendmail(fromaddr, toaddr, a)
   server.quit()
  
inviamail(msg)
fm.when_pressed = inviamail(msg3)
fm.when_released = inviamail(msg4)
irr.when_pressed = inviamail(msg1)
irr.when_released = inviamail(msg2)
pause()

da tenere in considerazione che il seguente codice lavora alla grande quindi non è un problema della funzione....
Codice:
#!/bin/usr/python
# /etc/init.d/notifica.py
###BEGIN INIT INFO
# Provides: notifica.py
# Required-Start:$remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description:Start daemon at boot time
# Description: Enable service provided by daemon.
### END INIT INFO

from gpiozero import Button
import smtplib

fm = Button(21) #controllo fm NO su pin21 NC su pin20
irr = Button(24) #controllo irrigazione NO su pin24 NC su pin23


fromaddr = 'mailmandante'
toaddr = 'mailricevente'
msg = 'subject:monitoraggio avviato'
msg1 = 'subject:irrigazione on'
msg2 = 'subject:irrigazione off'
msg3 = 'subject:corrente ripristinata'
msg4 = 'subject:mancanza corrente'

username = 'user'
password = 'password'
contirr = 1
contfm = 1
#definizione funzione invio mail
def inviamail(a):
  server = smtplib.SMTP ('smtp.gmail.com:587')
  server.starttls()
  server.login(username, password)
  server.sendmail(fromaddr, toaddr, a)
  server.quit()
 
inviamail(msg)
while True:
    if (fm.is_pressed and contfm==1):
        inviamail(msg3)
        contfm = contfm-1
    elif (contfm==0):
        inviamail(msg4)
        contfm = contfm+1
    if (irr.is_pressed and contirr==1):
        inviamail(msg1)
        contirr = contirr-1
    elif (contirr==0):
        inviamail(msg2)
        contirr = contirr+1
Risposta
  


Vai al forum:


Navigazione: 1 Ospite(i)
Forum con nuovi Post
Forum senza nuovi post
Forum bloccato
Forum Redirect