Input/Output tramite sms

Da raspibo.
Jump to navigation Jump to search

Siamo abituati ad usare il nostro raspberry connesso alla rete, ma ci sono dei casi in cui non abbiamo la possibilità di essere connessi, ed è in questi casi che potrebbe essere utile pensare di controllare il nostro raspberry tramite sms. E' difficile trovare una soluzione che abbia solo dei vantaggi, questa non è un'eccezione, i dati che riusciamo a scambiare con il raspberry sono molto ridotti e quindi ci dobbiamo limitare a dare dei comandi oppure a richiedere i dati di qualche sensore. Questo possiamo farlo a prezzi abbastanza bassi e con una copertura molto maggiore a quella del 2G/3G/4G. Se invece siamo coperti dal 3G potremmo sfruttare questo meccanismo per avviare la connessione 3G solo quando ne abbiamo bisogno visto che costa ancora tanto e consuma più energia. Tutto questo discorso ha senso se il raspberry non è fisso ma per qualche motivo si deve spostare oppure si trova in assenza di connessione.

Attenzione: In questa guida viene dato per scontato che la chiavetta usb sia già configurata e pronta all'utilizzo, una guida per la configurazione si trova qua.

Hardware

Una delle soluzioni più economiche è riciclare una chiavetta 3G usb.

Negli esempi io uso la Huawei E353 (in questo tutorial è spiegato come configurarla) ma dovrebbero funzionare anche altri modem.


Software(Raspbian)

Quello che si vuole realizzare è un piccolo sistema che sia in grado di ricevere gli sms e compiere determinate azioni in base alle parole chiave trovate negli sms.

Per fare questo abbiamo bisogno di qualcosa che stia in ascolto per la ricezione degli sms e come spesso accade c'è un tool fatto proprio per questo, sto parlando di "gammu-smsd" [[1]] la "d" sta per "daemon".

Procediamo con l'installazione, fortunatamente è presente nei repository quindi:

sudo apt-get install gammu-smsd

Ora procediamo con la configurazione, basta editare il file /etc/gammu-smsdrc che è diviso in due parti:

  • [gammu] - questa è la parte in cui vengono specificate le configurazioni relative al collegamento con il modem, per più informazioni leggere qui e il manuale con "man gammurc".
  • [smsd] - questa è la configurazione del demone

Per il nostro scopo nella configurazione di smsd il campo più rilevante è RunOnReceive che si aspetta uno script che verrà eseguito alla ricezione di uno o più sms.

Quindi la configurazione più semplice è questa:

....
[smsd]
Service = Null
RunOnReceive = /home/pi/script.sh

Il campo Service è stato impostato a Null per indicare che non abbiamo bisogno del salvataggio degli sms, se volessimo salvarli ci sono tante possibili alternative in quanto gammu-smsd supporta il salvataggio nel File System, Sqlite, MySql, PostgreSQL... per maggiori informazioni vi consiglio di leggere il manuale con "man gammu-smsdrc".

Visto che ora non ci interessa il salvataggio analizziamo solo il campo RunOnReceive, abbiamo visto che bisogna impostare uno script da chiamare alla ricezione ma dobbiamo ancora capire come i dati vengono passati allo script.

Gammu-smsd usa le variabili d'ambiente per il passaggio delle informazioni allo script, le variabili che ci interessano sono:

  • SMS_MESSAGES - il numero dei messaggi ricevuti
  • SMS_%d_NUMBER - il mittente
  • SMS_%d_TEXT - il testo del messaggio

"%d" è il numero dell'sms che parte da 1 e arriva al numero dei messaggi ricevuti.

Questi sono solo i campi che ci interessano in questa guida, per la completa documentazione consiglio di leggere il manuale con "man gammu-smsd-run".

Per avviare il demone:

gammu-smsd &

Se lo script impostato richiede i permessi di root per essere eseguito allora:

sudo gammu-smsd &

Con questo abbiamo visto tutto il necessario per fare quello che vogliamo, adesso passiamo agli esempi.

Esempi

Attenzione: il demone deve essere in esecuzione se vogliamo provare gli esempi, se non lo è al prossimo avvio verranno elaborati tutti gli sms ancora da ricevere.

Attivare/Disattivare un relè

Questo è un esempio di come controllare un relè con degli sms. Per informazioni relative all'interfacciamento del relè vi invito a leggere questa guida: Interfacciare un Rele'.

Per questo esempio ho costruito una piccola prolunga che viene controllata dal relè. Il relè che ho usato è in realtà un modulo (si trova nei soliti negozi online) già pronto per essere usato che ha 3 uscite: Segnale, +3v, GND.

Presa relay

Relay

Codice python:

In questo script viene importato "relay" è un modulo che ha due funzioni turnOn e turnOff sarà lui ad interfacciarsi con il relè, per la creazione di questo modulo consultate la guida: Interfacciare un Rele'.

#!/usr/bin/env python
import os, relay
def applyRules(sender, text):
    text = text.lower()
    for rule in rules:
        if rule['key'].lower() in text:
            rule['action']()
#per ogni parola chiave specificio una funzione da chiamare
rules = [{'key':'on','action':relay.turnOn},{'key':'off','action':relay.turnOff}]
num_sms = 0
if 'SMS_MESSAGES' in os.environ:
    num_sms = int(os.environ['SMS_MESSAGES'])
if num_sms > 0:
    for i in range(1, num_sms + 1):
        sender = 'SMS_%d_NUMBER' % i
        text = 'SMS_%d_TEXT' % i
        if sender in os.environ and text in os.environ:
            text = os.environ[text]
            sender = os.environ[sender]
            applyRules(sender,text)

Dobbiamo salvarlo in un file per esempio /home/pi/sms_relay.py e nel campo "RunOnReceive" del file di configurazione '/etc/gammu-smsdrc' dobbiamo impostare il path assoluto di questo file.

Quindi '/etc/gammu-smsdrc' diventa:

....
[smsd]
Service = Null
RunOnReceive = /home/pi/sms_relay.py

Rendiamo eseguibile il file:

chmod +x /home/pi/sms_relay.py

Ora possiamo avviare il demone e provare a inviare degli sms, importante che contengano almeno una parola chiave per vedere il risultato, in questo caso se scriviamo le due parole "on" e "off" nello stesso messaggio non si riuscirà a vedere nessun risultato perché lo fa troppo velocemente.