PyS60 blackout alarm


(english translation follows – segue testo in inglese )

Ci sono applicazioni che richiedono un controllo costante dello stato della linea elettrica, per segnalare eventuali interruzioni. Può trattarsi di sistemi di ricarica per l’industria o, più semplicemente, della linea elettrica domestica dei nonni dai quali correre in aiuto in caso di blackout.

È davvero semplice realizzare un "allarme blackout" via SMS utilizzando un vecchio terminale Series 60 e Python. Io ho utilizzato un glorioso Nokia 6630, che appartiene alla Series 60 2nd Edition Feature Pack 2.

6630_pyblackout.jpg

Prima di tutto è necessario installare il runtime PyS60 per il terminale in uso. I file di installazione aggiornati si possono scaricare dalla pagina del progetto su sourceforge, mentre consiglio un ottimo tutorial sull’installazione del runtime e sulla programmazione Python su Series 60 scritto da Jurgen Scheible.

Il vantaggio nell’utilizzare un Series 60 2nd Edition rispetto ad uno più recente appartenente alla 3rd Edition è nella maggiore facilità di installazione degli script. Mentre nella terza edizione occorre creare una cartella "Python" della memory card e copiarvi gli script all’interno utilizzando OBEX FTP (purtroppo non supportato nativamente dai driver Bluetooth di Windows XP), il runtime della 2nd Edition consente di inviare gli script via OBEX Push e di installarli direttamente dalla message box.

Un vecchio terminale 2nd Edition con il suo caricatore, Python for S60 e poche linee di codice sono sufficienti a creare questa applicazione. L’idea è banale: il telefono è connesso al caricabatterie, che a sua volta è connesso alla rete elettrica domenistica; poichè via software è possibile sapere lo stato del caricatore (connesso, non connesso, in carica, scarico…), se quest’ultimo appare disconnesso (ovvero la batteria non è mantenuta in carica) significa che "manca la corrente" e dunque c’è un blackout.

Python consente di scrivere in poche righe questa applicazione: lo script comincia chiedendo all’utente il numero di telefono el destinatario del messaggio d’allarme, dunque provvede a controllare lo stato del charger ogni 10 secondi. Non appena il caricatore risulta non connesso, l’applicazione manda un SMS al numero di telefono indicato all’inizio. Finito!

Prima di poter eseguire il codice sul terminale, è necessario installare la libreria sysagent, che permette di accedere ad alcune funzioni a basso livello dell’hardware e del sistema operativo. Occorre inoltre installare lo script esysagent come libreria; questo script fornisce le costanti numeriche utilizzate da sysagent.

È possibile scaricare questi due file dal sito Cyke64 (link diretti: sysagentesysagent). Su questo interessante sito potete trovare anche uno script d’esempio che mostra come utilizzare le funzioni di sysagent.

L’installazione può avvenire trasferendo via Bluetooth i due file sul telefono e selezionando "Install as lib" quando richiesto:

sysagent_py.png

A questo punto il runtime PyS60 possiede tutto ciò che serve a fare questo allarme blackout:


import e32, messaging, appuifw
import sysagent, esysagent

recipient = appuifw.query(u"Recipient:", "text")

print "Checking power line..."

while True:
    print "Sleeping..."
    e32.ao_sleep(10)
    print "Checking status"
    if sysagent.charger_status() != esysagent.ESAChargerConnected:
        print "Powerline is down!"
        messaging.sms_send(recipient, u"Powerline is down!")
        break

print "Bye bye..."

Lo script comincia importando alcuni moduli: e32 (per la gestione dei thread), messaging (per l’invio del messaggio d’allarme), appuifw (per visualizzare una popup) e la coppia sysagent-esysagent (per leggere lo stato del caricatoe). La prima istruzione visualizza la popup dove digitare il numero del destinatario::


recipient = appuifw.query(u"Recipient:", "text")

pyblackout_recipient.png

Un ciclo while() infinito controlla ogni 10 secondi lo stato del caricatore. In realta’ il ciclo parte aspettando 10 secondi prima di fare il controllo, dando cosi’ il tempo di connettere il caricatore al cellulare e alla linea elettrica. Scaduta la sleep(), viene invocata la funzione sysagent.charger_status(), che restituisce lo stato del caricatore (connected, disconnected, not charging). Se il caricatore non e’ connesso:


sysagent.charger_status() != esysagent.ESAChargerConnected

lo script invia il messaggio. That’s all!

pyblackout_start.png

There are some applications which require to verify powerline status and to report any power down event. It could be a industrial recharging system and, simpler, the domestic line of your grandparents (that may get in panic in case of blackout).

It is very easy to build an SMS-based "blackout alarm system" using an old Series 60 device and Python. I used a Nokia 6630, which belongs to Series 60 2nd Edition Feature Pack 2.

6630_pyblackout.jpg

First of all you need to get and install the PyS60 runtime tailored for your device. You can find all files at sourceforge and get read detailed installation instructions at Jurgen Scheible’s tutorial. Main advantage of 2nd Edition compared to the 3rd Edition is the easier installation process of Python scripts. While on the latter you have to create a "Python" forlder on memory card and trasfer files using OBEX FTP, the 2nd Edition lets you install applications simply (OBEX) pushing scripts to the messaging box.

An old 2nd Edition device with its charger, Python for S60 and a few lines of code are enough to build a (very) simple blackout alarm system. The idea is simple. The phone is connected to its charger, which is connected to powerline: if the charger seems to be disconnected (the battery is not charging), it means that powerline is down and the phone has to send an alarm message.

Python code is straightforward: it starts querying the telephone number to receive alarm messages, then checks the charger status every 10 seconds. When the charger status is not connected, it sends an SMS to the telephone number previously specified. That’s all!

Before writing the code, you need to install the sysagent library, which provides interface to some lowlevel hw & os routines. You have also to install the esysagent script, which defines names for numeric constants used by sysagent.

You can download these files from Cyke64 web site (direct links: sysagentesysagent). On this site, you can find also a sample script that shows how to use sysagent routines.

You can install both by simply pushing them via Bluetooth and clicking on "Install as lib" when prompted:

sysagent_py.png

Now the PyS60 runtime has all the stuff required to read charger status. Here’s the code:


import e32, messaging, appuifw
import sysagent, esysagent

recipient = appuifw.query(u"Recipient:", "text")

print "Checking power line..."

while True:
    print "Sleeping..."
    e32.ao_sleep(10)
    print "Checking status"
    if sysagent.charger_status() != esysagent.ESAChargerConnected:
        print "Powerline is down!"
        messaging.sms_send(recipient, u"Powerline is down!")
        break

print "Bye bye..."

The application stars importing some modules: e32 (for thread sleeping), messaging (for sending alarm messages), appuifw (to display the initial query popup) and sysagent-esysagent pair (to read charger status). The first instruction displays a popup where to type the phone number receiving alarm messages:


recipient = appuifw.query(u"Recipient:", "text")

pyblackout_recipient.png

An infinite while block checks every 10 seconds the status of powerline. The cycle starts pausing the application for 10 seconds (you have time to connect the handset to the charger, if it is still untethered). Then, it invokes the sysagent.charger_status() method, which returns the status of charger (connected, disconnected, not charging). If the charger appears not to be connected (sysagent.charger_status() != esysagent.ESAChargerConnected), the script sends a message to the recipient provided at startup.

pyblackout_start.png

27 pensieri su “PyS60 blackout alarm

  1. Andrea

    Ciao Stefano,

    innanzi tutto complimenti per l’idea, veramente bellissima! avrei delle domande pero’:

    1) Potrebbe funzionare sul nokia 6600?
    2) Una volta che il programma rileva la mancanza di corrente cosa fa?
    Continua a mandare sms ogni 10 secondi o si ferma? e’ possibile dopo che e’ stata ripristinata la corrente farlo ripartire?
    Una cosa interessante sarebbe fare in modo che, una volta spedito il messaggio vengono cambiati i parametri del programma e continua a looppare senza fare nulla perche’ i nuovi parametri gli dicono: “finche’ manca corrente non fare nulla” in questo modo appena torna corrente manda un messaggio per avvisarti che e’ tornata e rimette i parametri come in origine e continua a non fare nulla finche’ c’e’ corrente e cosi’ via.

    Sarebbe un ciclo perpetuo e inquesto modo non dvresti fare nulla al programma ogni volta che va via corrente ti avvsa e quando torna ti avvisa, tutto li….

    resto a disposizione per chiarimenti 🙂
    ciao ciao

  2. Andrea

    Mi sono dimenticato un dettaglio 🙂 sarebbe comodo se i numeri da inserire per farsi inviare sms, fossero almeno 2, con i gestori che ci ritroviamo e’ molto probabile che uno non arrivi! 🙂

    ciao ciao

  3. jumpjack

    Guarda guarda… un ALTRO utilizzo interessanre per un cellulare!!
    A questo non avevo proprio pensato!

    http://jumpjack.wordpress.com/2008/06/07/what-can-you-do-with-an-old-cellphone/

    Pero’ me ne hai fatto venire in mente un altro, chissa’ se si puo’ fare: l’utilizzo come logger (di temperatura, umidità o altro).
    Secondo te è possibile collegare un sensore qualunque al posto del microfono, in modo da fargli registrare dati ambientali?

    Col PC è possibile usare la scheda audio per campionare dati analogici, forse lo è anche col cellulare?
    http://jumpjack.wordpress.com/2008/05/20/worlds-cheapest-remote-control-replicator-just-1/

  4. jumpjack

    Ehi, un’altra grande idea: ho un aggeggio che misura in ogni istante il consumo di corrente, ma non è in grado di memorizzarlo. Pero’ ha un display LCD.
    Sarebbe possibile “catturare” con la cam del cell un’immagine, analizzarla per “tradurla” in numeri, e quindi memorizzare i dati?!?

  5. gerdavax Autore articolo

    Probabilmente sarebbe piu’ comodo, anziche’ modificare il microfono, individuare una delle diverse porte seriali esposte dal cellulare e connetterci un sensore attraverso un microcontroller totato di quache ADC e una UART TTL (ad esempio, i soliti PIC o Atmel). Le schede audio di oggi hanno dei DSP abbastanza sofisticati da fare buona parte dell’analisi del campione direttamente in hardware, non so di cosa siano equipaggiati i cellulari. Quanto alla seconda idea, cioe’ realizzare un OCR su cellulare, e’ cio’ che viene fatto da tempo con i visual tag (QR, datamatrix, shotcode), in cui la fotocamera del cellulare esegue una scansione continua delle immagini identificando le figure compatibili con il formato di tag riconosciuto (http://en.wikipedia.org/wiki/QR_Code).

  6. jumpjack

    Non mi sembra poi cosiì “comodo” dover costruire un circuito con un microcontroller che deve oltretutto essere preventivamente programmato! Senza contare la gestione della porta seriale del cell…
    Io cercavo una soluzione SEMPLICE! Di circuiti comlessi che si interfacciano coi cellulari se ne trovano a decine, su internet.

  7. jumpjack

    Mi è venuta un’idea per un’altra applicazione: un allarme anti intrusione per la casa.
    Se si “cablano” le finestre/serrande di casa in modo che aprendone anche solo una non arrivi alimentazione al caricabatterie, quando il cell rileva assenza di tensione, vuol dire che una finestra è stata aperta (meglio applicare i sensori alle serrande, le finestre si possono anche semplicemente sfondare!).

    Pero’ servono due cell anziche’ uno: l’altro va collegato direttamente alla rete elettrica, in modo da poter distinguere se è mancata la corrente o se è stata aperta una finestra.

    Naturalmente si puo’ abbinare lo scatto di qualche foto alla rilevazione di intrusione!

    Quanto al “blackout alarm”, prendendo spunto dal tuo semplice sorgente, da altri sorgenti trovati in giro e dal mio LCCarTrack, un programma attivato tramite SMS, ho scritto un programma che puo’ attivare/disattivare il controllo sull’alimentazione inviandogli un SMS.
    Sto facendo un po’ di debug, se interessa lo posso mettere su GoogleCode cosi’ ci lavoriamo in due (o piu’).

    Qui c’e’ LCCarTrack:
    http://code.google.com/p/lc-cartrack/

  8. Oper

    Ho modificato un po’ il codice come diceva Andrea:
    paticamente ora va in ciclo infinito e se ritorna la corrente dopo un’interruzione invia un messaggio e riprende a controllare:

    import e32, messaging, appuifw
    import sysagent, esysagent

    recipient = appuifw.query(u”Recipient:”, “text”)

    print “Checking power line…”

    print “Sleeping…”
    sent=0
    while True:
    e32.ao_sleep(10)
    if sent==0:
    print “UP-Checking status”
    else:
    print “Down-Checking status”
    if sysagent.charger_status() != esysagent.ESAChargerConnected:
    if sent==0:
    sent=1
    print “Powerline is down!”
    messaging.sms_send(recipient, u”Powerline is down!”)
    else:
    if sent==1:
    sent=0
    print “Powerline is up!”
    messaging.sms_send(recipient, u”Powerline is up!”)
    print “Sleeping…”

  9. Oper

    osi’ potrebbe andare veglio, naturalmente basta togliere i puntini, ehehe:

    import e32, messaging, appuifw
    import sysagent, esysagent
    recipient = appuifw.query(u”Recipient:”, “text”)
    print “Checking power line…”
    print “Sleeping…”
    sent=0
    while True:
    ….e32.ao_sleep(10)
    ….if sent==0:
    ……..print “UP-Checking status”
    ….else:
    ……..print “Down-Checking status”
    ….if sysagent.charger_status() != esysagent.ESAChargerConnected:
    ……..if sent==0:
    …………sent=1
    …………print “Powerline is down!”
    …………messaging.sms_send(recipient, u”Powerline is down!”)
    ….else:
    ……..if sent==1:
    …………sent=0
    …………print “Powerline is up!”
    …………messaging.sms_send(recipient, u”Powerline is up!”)
    …………print “Sleeping…”

    Scusa i troppi commenti, volendo puoi modificare direttamente il mio primo post.

  10. jumpjack

    Ho esteso il programma anche io, ma ho un problema: una volta inviato il primo mex…. il cell si rifiuta di mandare altri mex, dà sempre l’errore “Already sending”!!
    Come faccio?!? Ho provato anche ad aspettare parecchi minuti prima di mandare il secondo mex!

  11. jumpjack

    Sono riuscito a sistemare il mio programma!
    L’ho messo su googlecode:
    http://powerwarning.googlecode.com/svn/trunk/powerwarning/PowerWarning.py

    Vi servrà anche il file settigns.ini , in cui memorizzare il numero a cui inviare i messaggi.
    http://code.google.com/p/powerwarning/source/browse/#
    (cliccate su TRUNK/POWERWARNING )

    Il monitoraggio si attiva e disattiva tramite SMS.
    Io ho anche inserito il caricabatterie in un circuito elettrico che viene interrotto se qualcuno apre una porta o una finestra… col risultato che vengo informato se qualcuno mi entra in casa! 🙂
    (Naturalmente serve anche un secondo cellulare, per distinguere le intrusioni dalle interruzioni di corrente).

  12. gerdavax Autore articolo

    Io credo sarebbe meglio che l’interruttore sulla finestra apra il circuito in bassa tensione (ovvero, a valle dell’alimentatore) anziche’ quello sulla linea a 220V; l’impianto e’ decisamente piu’ sicuro… per tutti!

    Un altro dubbio: non e’ troppo dispendioso usare DUE cellulari?

  13. jumpjack

    L’idea del circuito a bassa tensioen è buona, ma è da verificare se le perdirter non siano tali da impedire che il cellulare si carichi!

  14. Fabrizio

    Ho provato il tuo script che mi interessa molto sul Nokia 6600, ma a me dà ancora il problema che una volta inviato il primo mex…. il cell si rifiuta di mandare altri mex, dà sempre l’errore “Already sending”!!
    Qualche suggerimento?
    Se interessa, io avevo già scritto la stessa cosa in VB.net per i cell con mobile6. Ma visto che ho un 6600 che non uso più, sarebbe perfetto avere l’allarme lì, anziché dover lasciare a casa il Tytn II che uso normalmente.

  15. jumpjack

    Per l’errore di “already sending”, mi è venuta in mente una possibile soluzione: modificare il file di libreria messaging.py di Python, che secondo me contiene un errore, in modo che non si blocchi in caso un messaggio non venga spedito, visto che tanto, se la spedizione fallisce, viene ritentata automaticamente.

    Pero’ non l’ho ancora sperimentato…

    Il file sta in \system\apps\python\libs.
    La riga:
    raise RuntimeError, “Already sending”
    andrebbe sostituira con
    pass
    (rispettando il numero di spazi).

    Pero’ nell’unica prova che ho fatto, cioe’ un mini programma che manda SMS a raffica ogni 10 secondi, il problema dell’ “already sending” non si presenta, boh…

  16. Andrea

    Ciao a tutti, sono quell’Andrea che ha scatenato tutta questa discussione. Innanzi tutto mi scuso con Gerdavax per aver fatto la richiesta ed essere sparito nel nulla, ma e’ stato un periodo veramente difficile!, comunque sono interessato piu’ che mail all’argomento. L’unico problema e’ che non capisco assolutamente nulla di queste cosa, per cui avro’ bisogno del vostro aiuto. Passiamo alle domande preliminari :), ho due telefoni sui implementare questo software, uno e’ un N80 e uno e’ il 6600. Diciamo che preferirei usare il 6600, ma se mi consigliate l’altro per prestazioni migliori e facilita’ di implementazioni, passo subito all’altro. Ho ancora una domanda, quando vado a scaricare Pyton vi sono molti link con varie veriosni, cosa mi consigliate da scareicare?, appena scaricato e installato (se ci riesco), vi faro’ altre domande 🙂 per adesso GRAZIE a tutti. Andrea

  17. romano

    Ciao a tutti! Ecco mi serviva proprio quest’applicazione…ma per Win Mobile 6 !! 🙂 Fabrizio, se ci sei batti un colpo e fammi sapere come avere quello che avevi preparato! Grazie, romano.

I commenti sono chiusi.