Per la realizzazione della v2 del progetto abbiamo utilizzato il Raspberry PI 3B che dispone di una scheda WiFi e di 4 porte USB per la comunicazione seriale, oltre che di Bluetooth e Ethernet.

Le sue caratteristiche tecniche sono: Quad Core 1.2GHz Broadcom BCM2837 64bit CPU, 1GB RAM, BCM43438 wireless LAN and Bluetooth Low Energy (BLE) on board, 40-pin extended GPIO, 4 USB 2 ports, 4 Pole stereo output and composite video port, Full size HDMI, CSI camera port for connecting a Raspberry Pi camera, DSI display port for connecting a Raspberry Pi touchscreen display, Micro SD port for loading your operating system and storing data, Upgraded switched Micro USB power source up to 2.5A
Sul dispositivo è stata installata una distribuzione Raspbian, configurando il WiFi per la connessione alla rete ed installando le librerie che ci sono servite per realizzare la connessione HTTP al server per le richieste al Database (Requests) e per la comunicazione con i Bots di Telegram (Telepot).
Per il
Libreria Requests
La libreria per Python Requests si fa carico di tutto il lavoro per implementare HTTP/1.1 rendendo immediata l’integrazione delle applicazioni con i web services. Non c’è bisogno di aggiungere manualmente query string agli URL, o di fare form-encoding dei dati di POST. Il Keep-alive e il pooling delle connessioni HTTP sono 100% automatici.
La sua installazione si può effettuare scrivendo il seguente comando nella console con permessi sudo:
pip install requests
Per poterla poi utilizzare all’interno del programma Python occorre importarla in esso:
import requests
Le caratteristiche di questa potentissima libreria sono: Domini e URL internazionali, Keep-Alive e Pooling delle connessioni, Sessioni persistenti attraverso i cookie, Verifica SSL come la fanno i browser, Autenticazione Basic/Digest, Cookie chiave/valore, Decompressione automatica dei dati, Corpo delle risposte in Unicode, Upload di file multipart, Timeout sulle connessioni, Supporto per .netrc
, Supporto per Python 2.6—3.4, Thread-safety.
Libreria Telepot
Per installare Telepot, una estensione in Python che permetterà a Raspberry di chattare con te dando vita ai Bots, si devono inserire i seguenti comandi in console:
sudo apt-get install python-pip sudo pip install telepot
La libreria dove essere importata nel programma Python in cui sarà utilizzata:
import telepot
Programma Python
Il programma per la gestione della connessione persistente al server, per la lettura dei valori dello stato degli attuatori e la scrittura dei valori delle grandezze lette dai sensori tramite Arduino, e per la comunicazione con i Bots di Telegram, prevede la comunicazione seriale con Arduino per il passaggio dei valori.
Importate le necessarie librerie vengono realizzate la connessione a Telegram, tramite il metodo Bot di Telepot passando il Token fornito durante la creazione del bot, e quella seriale con Arduino, rimanendo in ascolto con un tempo di ritardo da noi impostato a 5 sec.
Programma Python
#!/usr/bin/env python import time import serial import requests import telepot import datetime from sys import exit array_valori=[] valori=[] counter=0 ctrl=0 url='' tempo_ultima_connessione=0 intervallo_connessioni=5 #sec tra una httprequest e l'altra #Gestione Telegram Bots id_a = [xxxxxxxxxxx] def handle(msg): chat_id = msg['chat']['id'] command = msg['text'] sender = msg['from']['id'] if sender in id_a: if command == 'Sensori': bot.sendMessage(chat_id, 'T='+valori[0]+'; H='+valori[1]+'; L='+valori[2]) elif command == 'T': bot.sendMessage(chat_id, 'T='+valori[0]) elif command == 'H': bot.sendMessage(chat_id, 'H='+valori[1]) elif command == 'L': bot.sendMessage(chat_id, 'L='+valori[2]) elif command == 'Accendi riscaldatore': requests.get('http://mylegalplants.it/web_app/attiva_T.php?T=1') bot.sendMessage(chat_id, 'Riscaldatore acceso') elif command == 'Spegni riscaldatore': requests.get('http://mylegalplants.it/web_app/attiva_T.php?T=0') bot.sendMessage(chat_id, 'Riscaldatore spento') elif command == 'Accendi irrigazione': requests.get('http://mylegalplants.it/web_app/attiva_H.php?H=1') bot.sendMessage(chat_id, 'Irrigazione accesa') elif command == 'Spegni irrigazione': requests.get('http://mylegalplants.it/web_app/attiva_H.php?H=0') bot.sendMessage(chat_id, 'Irrigazione spenta') elif command == 'Accendi illuminazione': requests.get('http://mylegalplants.it/web_app/attiva_L.php?L=1') bot.sendMessage(chat_id, 'Illuminazione accesa') elif command == 'Spegni illuminazione': requests.get('http://mylegalplants.it/web_app/attiva_L.php?L=0') bot.sendMessage(chat_id, 'Illuminazione spenta') else: bot.sendMessage(chat_id, 'Non sei autorizzate a darmi ordini!') #bot.sendMessage(chat_id, sender) bot = telepot.Bot('xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx') #TelegramBotToken MyLegalPlantsBot bot.message_loop(handle) print 'Sono in ascolto per Telegram..' #Gestione invio/ricezione valori Sensori/Attuatori arduino = serial.Serial( port='/dev/ttyACM0', baudrate = 9600, parity = serial.PARITY_NONE, stopbits = serial.STOPBITS_ONE, bytesize = serial.EIGHTBITS, timeout = 1 ) try: while True: while arduino.in_waiting: #aspetto che ci sia comunicazione da parte di Arduino, che detta i tempi RxData = arduino.read() if RxData=='!': ctrl=1 #inizio valori inviati del array_valori[:] #cancello tutti gli elementi dell'array if RxData=='/': ctrl=0 #fine valori inviati if ctrl==1 and RxData!='!': array_valori.append(RxData) if ctrl==0: #print array_valori[:] string_valori=''.join(array_valori) #stringa ottenuta dall'array_valori valori=string_valori.split('|') #array dei valori di T, H e L #controllo HTTPRequest server tempo_attuale=time.time() if (tempo_attuale-tempo_ultima_connessione)>intervallo_connessioni: tempo_ultima_connessione=tempo_attuale if tempo_ultima_connessione!=0 and len(valori)>0: r = requests.get('http://mylegalplants.it/web_app/inserisci_valori.php?'+'T='+valori[0]+'&H='+valori[1]+'&L='+valori[2]) r_string=r.text print valori[0],'-',valori[1],'-',valori[2],'|',r_string[0],'-',r_string[2],'-',r_string[4] r_bytes=r_string.encode() #conversione string->bytes arduino.write(r_bytes) if r_string[2]=='1': #temporizzo irrigazione print 'temporizzo irrigazione' time.sleep(10) requests.get('http://mylegalplants.it/web_app/attiva_H.php?H=0') r_string_new=r_string.replace('1','0',1) r_bytes_new=r_string_new.encode() #conversione string->bytes arduino.write(r_bytes_new) # per uscita con interrupt da tastiera dal programma (control+C) except KeyboardInterrupt: exit()