Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Ricerca personalizzata
16
voti

Domotica e notifiche su smartphone

Indice

Introduzione

Insomma avete comprato un Raspberry Pi, un Odroid o un qualche genere di SoC con un processore ARM e ci avete collegato tutti i sensori di casa, il citofono, il frullatore e l'ascensore per la Bat-caverna. Ma cosa succede se la pompa delle acque nere non parte e il serbatoio si riempie mentre siete fuori casa? (Già successo, non un bello spettacolo ve lo assicuro).
Sarebbe bello poter ricevere delle notifiche direttamente sul telefono per certi rilevamenti, o anche solo per avere un report giornaliero sullo stato di tutti i sensori.
Be', che ci crediate o no, in un mondo «sempre più connesso» (cit.) spedire delle push notification verso un telefono, un tablet Android/iOS e perché no, anche un PC è davvero semplice.
Questa breve guida vi aiuterà a muovere i primi passi utilizzando Debian 8 e Python 2.7, ma rimane valida anche per i più comuni sistemi operativi e linguaggi di programmazione.
Nota: la guida presuppone che la vostra board sia già connessa ad internet in un qualche modo.

C

C'è sempre quello che si scorda il riscaldamento acceso.

La mia prima notifica

Prima di tutto dobbiamo scegliere che applicazione utilizzare per ricevere le notifiche. Sfortunatamente la gestione delle push notification richiede un sistema di terze parti ed è necessaria un po' di ricerca per trovare qualcosa che possa andare bene per le nostre esigenze.
Dopo aver speso qualche ora a confrontare diversi servizi ho deciso di provare Pushover. Mi ci sono trovato molto bene e in questo articoletto vedremo come utilizzare questo servizio.
Pushover fornisce diverse opzioni interessanti, tra cui la possibilità di creare delle applicazioni personali (quindi distinguere la sorgente di una notifica) e trattare le notifiche in modo diverso, ad esempio assegnandole una priorità con cui possiamo bypassare la modalità silenziosa del telefono per farlo squillare in caso di urgenza. L'API è semplice da utilizzare e ci sono già esempi in tanti linguaggi di programmazione. Pushover è inoltre supportato da una moltitudine di altre applicazioni.
Essendo un servizio completo e - a quanto ho visto finora - professionale, non è gratuito. Dopo 7 giorni di trial vi verrà chiesto di versare 5€ one-time (non è un abbonamento mensile o annuale). Leggete le FAQ qui.

Ho cercato altre soluzioni gratuite ma non ho trovato niente di simile a quello che offre Pushover. Inoltre la maggior parte delle policy sul trattamento dei dati mi hanno fatto arricciare il naso, quindi alla fine ho optato per qualcosa di serio, ho pagato la mia quota e non ci penso più.
Se avete suggerimenti lasciate un commento a fondo pagina e sarò ben contento di valutare altri prodotti.

Installazione

Per installare l'applicazione sul telefono/tablet basta scegliere la piattaforma desiderata dalla pagina ufficiale e seguire le istruzioni dello store come per ogni altra applicazione.

Registriamoci al servizio, effettuiamo il log in sull'app appena scaricata e seguiamo le istruzioni a schermo.
Vi verrà inoltre inviata una mail per confermare l'indirizzo di posta elettronica.

A questo punto nella pagina principale del sito di Pushover troverete un form per inviare notifiche ai device registrati. Speditevi un messaggio per testare il funzionamento dell'applicazione.
Nella colonna di destra troviamo invece la user key che ci servirà per utilizzare l'API di Pushover. Inoltre troviamo un indirizzo di posta elettronica a cui possiamo spedire delle email che verranno reindirizzate al nostro telefono sotto forma di notifica.

Creare un'applicazione

Ogni notifica deve essere generata da una applicazione, quindi prima di poter iniziare i nostri test dobbiamo creare un'applicazione su Pushover.
Dal sito scegliamo il menu "Apps & Plugins" e selezioniamo "Create a New Application". Inseriamo un nome per l'applicazione e riempiamo gli altri campi a piacere. Possiamo aggiungere anche un'icona per distinguere facilmente le notifiche una volta che ci vengono spedite sul telefono.


Una volta fatto, selezioniamo "Create Application". La nostra nuova applicazione viene generata.

Cliccando sul nome dell'applicazione una nuova pagina verrà caricata, con all'interno l'application token. Questo codice, assieme alla user key che abbiamo ottenuto in precedenza, ci servirà per spedire le notifiche al nostro telefono.


Test da linea di comando

Siamo pronti per un primo test, dalla linea di comando digitiamo:

curl -s \
--form-string "token=[app_token]" \
--form-string "user=[user_key]" \
--form-string "message=This is a message." \
--form-string "title=This is a title" \
https://api.pushover.net/1/messages.json

o, su una riga sola:
curl -s --form-string "token=[app_token]" --form-string "user=[user_key]" --form-string "message=This is a message." --form-string "title=This is a title" https://api.pushover.net/1/messages.json

Logicamente, [user_key] e [app_token] devono essere quelle fornite da Pushover.
Nota: se usate Windows/PowerShell, il comando è leggermente diverso, vedete: https://pushover.net/faq#library-win32

Se tutto è andato come deve, nel giro di pochi secondi riceveremo il messaggio di test.

Funziona davvero.

Funziona davvero.

Consultate la guida alla API per tutti i parametri che possiamo usare durante l'invio della notifica.

Un po' di Python

L'esempio che ho scritto è molto simile a quello fornito precotto dal sito di Pushover.
Ci sono esempi per molti linguaggi diversi, vi consiglio di dare un occhio alla pagina dedicata:

https://pushover.net/faq#library

Creiamo il file di test e rendiamolo eseguibile:

touch test_notification.py
chmod +x test_notification.py

Banalmente, lo script include la funzione sendNotification() che non fa altro che chiamare l'API di Pushover e passare qualche parametro. In questo caso:

  • token: come abbiamo già visto, l'hash della nostra applicazione
  • user: l'hash utente
  • html: settato a 1, permette la formattazione del messaggio con semplici tag HTML
  • priority: definisce l'urgenza del messaggio, da -2 a 2, default 0. Maggiori dettagli qui
  • title: il titolo della notifica
  • message: il messaggio vero e proprio
#! /usr/bin/python
# coding: utf8

import httplib, urllib, time

# Send Pushover notification
def sendNotification(title, message):
    conn = httplib.HTTPSConnection("api.pushover.net:443")
    conn.request("POST", "/1/messages.json",
        urllib.urlencode({
            "token": "[app_token]",
            "user": "[user_key]",
            "html": "1",
            "priority": "0",
            "title": title,
            "message": message,
        }), { "Content-type": "application/x-www-form-urlencoded" })
    conn.getresponse()
    return;

# Main
title = "Python test"
message = """Qusto è un messaggio di test.
             Il messaggio è stato generato alle """ + time.strftime("%H:%M:%S") + """

             Prova formattazione html:
             - testo in <b>grassetto</b>
             - testo <u>sottolineato</u>
             - testo in <font color=\"#9F000F\">rosso</font>"""
sendNotification(title, message)

Lanciamo lo script con python test_notification.py o con ./test_notification.py e la notifica ci verrà inviata. Ed ecco il risultato:

Scheduling

Questo esempio utilizza Debian e lo scheduler di sistema cron.
A volte può essere utile ricevere un report generato automaticamente con una certa frequenza. In questo caso supponiamo di avere uno script (che chiameremo heating_report.sh) che legge un sensore e il cui output è:

Heating system report:
Heating is: off
Last powered on: Wed Sep  2 06:25:47 IST 2015

Possiamo aggiungere qualche tag HTML nello script per formattare l'output per le nostre notifiche:

<b><u>Heating system report:</u></b>
Heating is: <b><font color="#41A317">off</font></b>
Last powered on: Wed Sep  2 06:25:47 IST 2015

A questo punto inseriamo una chiamata all'API di Pushover nello scheduler utilizzando curl come nell'esempio utilizzato per mandare un messaggio di test da linea di comando. In questo caso però dovremo inviare l'output di uno script, quindi dovremo modificare

--form-string "message=This is a message."

con

--form-string "message=$(bash heating_report.sh)"

Questo piccolo trucco ci permette di eseguire lo script, prenderne l'output e passarlo come argomento di "message".
Nota: in questo caso ho utilizzato bash per eseguire lo script, ma ovviamente non funzionerà se lo script è scritto in un altro linugaggio. Se ad esempio lo script è in Python, il comando diventerà
message=$(python script.py)

Modifichiamo lo scheduler con
crontab -e
cron ulitizza una sua sintassi per definire quando lanciare il comando che vogliamo. Il comando deve essere preceduto da 5 valori che definiscono: minuto (0-59), ora (0-23), giorno del mese (1-31), mese (1-12), giorno della settimana (0-6, 0=Domenica). Il carattere "*" si può usare per non specificare un valore, ad esempio in questo caso lo utilizzeremo per non definire il giorno del mese, il mese e la settimana.
Per lanciare il comando ogni giorno alle 19:00, nello scheduler scriveremo:

0 19 * * * comando

Per altri esempi comuni, fate riferimento a una delle molte guide che potete trovare cercando "cron" con Goolge.

Adesso possiamo inserire il nostro comando all'interno dello scheduler, nel formato:
0 19 * * * curl -s --form-string "token=[app_token]" --form-string "user=[user_key]" --form-string "html=1" --form-string "message=$(bash heating_report.sh)" --form-string "title=Scruffy alerting system" https://api.pushover.net/1/messages.json

Conclusione

Abbiamo visto che inviare una notifica è davvero semplice e che con qualche riga di codice possiamo facilmente integrare questo servizio con gli script e i programmi che già abbiamo.
La documentazione di Pushover è ben fatta e semplice, vi consiglio di leggerla per scoprire le altre opzioni che non ho trattato in questo breve aricolo:

https://pushover.net/api
https://pushover.net/faq#technical


8

Commenti e note

Inserisci un commento

di ,

Bell'articolo è sopratutto interessante al passo coi tempi.

Rispondi

di ,

A ognuno il suo, al momento ricevo una decina di notifiche al giorno, ma sono destinate ad aumentare non appena avrò finito di montare pushover sugli altri server. Non voglio intasare la mia mail personale con notifiche del genere. Inoltre ho bisogno di notifiche che mi tirino giù dal letto se ci sono problemi gravi!

Rispondi

di ,

Non per essere pignolo e fare la pecora nera, ma non basta una semplice email? Con Android hai la notifica di ricezione email quasi instantaneamente, un po' come l'app PushOver che di fatto fa un controllo ogni numero di secondi se ci sono nuove notifiche. Senza contare che l'app ha un costo di 4,99$. Non sono poi tanti visto che bisogna pagarli una sola volta, ma di solito evito di reinventare l'acqua calda.

Rispondi

di ,

Grazie a tutti!

Rispondi

di ,

Bel lavoro, complimenti!!!

Rispondi

di ,

Spettacolare. Avevo collegato una schedina Raspberry Pi per gestire delle telecamere IP. Questa è la ciliegina sulla torta che mancava :).

Rispondi

di ,

Molto interessante! Grazie.

Rispondi

di ,

curl -s \

--form-string "token=[app_token]" \

--form-string "user=[user_key]" \

--form-string "message=Che bell'articolo!" \

--form-string "title=Complimenti!" \

https://api.pushover.net/1/messages.json

Rispondi

Inserisci un commento

Per inserire commenti è necessario iscriversi ad ElectroYou. Se sei già iscritto, effettua il login.