Per chi si fosse perso le puntate precedenti: Parte prima, Parte seconda, Parte terza
Il nostro sistema funziona già bene, abbiamo impostato la struttura principale, adesso ci servono i ricami.
Se va via la corrente, come facciamo a farlo riprendere in automatico e avvisarci di questo? Ci viene in aiuto un nuovo pezzetto di codice, che ho chiamato “avvia_reboot.py”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | #!/usr/bin/env python2.7 import tweepy import sys import datetime import time import os import requests import json # qualche costante file_di_log = "/home/pi/tweepy/motion.log" # file di log del sistema di controllo utente_dm = "@tuoutente" # utente a cui mandare i DM (magari poi saranno gestibili diversi utenti) # Chiavi e autenticazione per Twitter consumer_key = 'xxx' consumer_secret = 'xxx' access_token = 'xxx' access_token_secret = 'xxx' auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth) # apro il file di log in append log = open (file_di_log, "a") # memorizzo il timestamp attuale (cosi' lo metto nei tweet ed evito il blocco dei doppioni) ts = time.time() st = datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S') # avvio motion os.system("/home/pi/motion-mmal/motion") # recupero l'indirizzo IP pubblico assegnato al router, non si sa mai req = requests.get("http://httpbin.org/ip") if req.status_code == 200: text = json.loads(req.text) ip = text['origin'] api.send_direct_message(utente_dm,text="Reboot! Motion Attivato! Indirizzo IP pubblico: " + ip + " - " + st) log.write(st + " - Motion attivato dopo reboot \n") # chiudo il file di log log.close() |
Il codice è tutto commentato, direi che non dovrebbe essere di grande difficoltà. In parole povere quando viene eseguito il programma questo avvia il processo “motion”, recupera l’indirizzo IP pubblico assegnato al router (è una comodità e potrebbe sempre tornare utile nel caso in cui si volesse accedere da remoto alla propria rete, sempre se avete fatto le dovute configurazioni) e infine avvisa con un DM che il servizio è attivo e qual è l’IP pubblico nuovo.
Introduciamo qui il log delle attività del sistema. Perché un file di log? Perché è bene sapere cosa ha fatto il sistema per capire ed andare a trovare errori durante gli sviluppi e l’attività. Da ora in poi tutti i programmi scriveranno le cose essenziali nel file di log nel formato [dataora] – [evento]. Vi ricordo che con il comando
1 | tail [nomefile] -f |
potete vedere in tempo reale cosa viene scritto nel file di log. Questa visualizzazione occupa la console, aprite una sessione aggiuntiva sul Raspberry. Il file non si chiama “motion” o un nome che contenga “motion” perché nel caso in cui vogliate controllare il funzionamento visualizzando il file di log con il comando “tail”, quando cercheremo di scoprire se “motion” è attivo, il nome del file di log potrebbe falsare questa attività.
Questo programma per avviare il motion controller però deve essere eseguito dal Raspberry in automatico al riavvio del sistema, come si fa?
Dalla riga dei comandi scrivete
1 | crontab -e |
Si apre l’editor di testo “nano” con le impostazioni delle operazioni pianificate del processo cron, lo useremo ancora dopo questa parte. Andate al fondo ed aggiungere queste righe
1 2 | # avvio il motion control all'avvio del sistema @reboot python /home/pi/tweepy/avvia_reboot.py >/dev/null 2>&1 |
Premete Ctrl+o, confermate con Y, poi Ctrl+x e uscite dal programma, lo schedulatore viene immediatamente aggiornato. Avete appena detto al Raspberry che al riavvio deve eseguire il programma che abbiamo appena scritto, la parte al fondo “>/dev/null 2>&1” farà sì che il risultato dell’attività non vi arrivi come mail di sistema, insomma non lascia traccia
Bel post,
anche l’idea di pescare l’IP da httpbin.org/ip mi piace, anche se io personalemtne preferisco avere un hostname fisso su IP variabile.
Ho registrato un hostname [0] su dnsdynamic.org e il mio rapsberry tramite il ddclient [1] aggiorna ogni 10 minuti l’IP del mio router, quindi male che va sono down per qualche minuto.
Configurato il port forward sul router, posso accedere da ovunque nel mondo a ssh, sftp, http (https mi sta facendo venire il mal di testa) e un serverino cloud dropbox-like : seafile [2] . Una bella intervista con lo sviluppatore (in un inglese orribile btw) la trovi qui [3]
A proposito di webserver, tu che mi pari ferrato : io uso lightppd, come va con apache ? Ho anche trovato vari proggetti che si appoggiano a nginix ma sono restio a usare questa roba su un dispositivo cosí scarso in risorse… Magari metteró un Raspberry (o BeagleBoard) dedicato solo a comunicare con l’esterno.
[1] http://blog.mivia.dk/free-dynamic-dns-for-raspberry-pi/
[2] http://draptik.github.io/blog/2014/04/21/installing-seafile-on-raspberry-pi/
[3] http://twit.tv/show/floss-weekly/290