Raspberry

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.

Raspberry PI 3B

 

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 .netrcSupporto 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()