TSM - Proiect IoT: Monitorizarea unui acvariu cu pești

Ovidiu Mățan - Fondator @ Today Software Magazine


Problema de la care am pornit este destul de des întâlnită. Plecăm de acasă și dorim să știm ce se întâmplă cu plantele sau cu acvariul cu pești - cazul nostru. Nu sunt un fan al camerelor de supraveghere pentru că pot să fie folosite ușor ca instrument de atac la intimitatea fiecăruia, iar postarea online a datelor nu garantează securitatea. De fapt, reprezintă mai mult decât este nevoie pentru a avea o simplă soluție de monitorizare. Cerințele aplicației noastre sunt modeste: realizarea unei poze la un interval de douăzeci de minute și postarea acestora pe un site ftp la care să avem acces.

De ce avem nevoie?

Aceste componente ar trebui să se găsească în casa oricărui programator. O placă Raspberry PI, o cameră video pe interfața CSI sau USB și o conexiune la internet. Vom folosi sistemul de operare Raspbian, iar ca limbaj de operare, am ales Python deoarece are un bun suport în zona librăriilor IOT. Librăriile folosite sunt:

time și datetime - pentru controlul intervalului în care se fac pozele și pentru numele pozelor;

picamera - captura de poze ;

ftplib - comunicarea ftp.

Codul sursă:

 

from time import sleep
from picamera import PiCamera
import ftplib
import datetime

def startCamera():
    camera = PiCamera()
    camera.rotation = 180
    camera.resolution = (1024, 768)
    camera.framerate = 2
    camera.exposure_compensation =20
    return camera

def startFtpConn():
    ftp = ftplib.FTP()
    ftp.set_debuglevel(2)
    ftp.connect('ftp.ourwebsite.ro'    
    ,21, timeout=10)

    ftp.set_pasv(False)

 print(ftp.welcome)
 try:
   print('logging in')
   ftp.login('ovidiu@ourwebsite.ro', 
   'parola')

  except:
    print('unable to login')
    return ftp

camera = startCamera()

while True:
  camera.start_preview()
  ftp = startFtpConn()
  now = datetime.datetime.now()
  if now.hour > 18 or now.hour < 8:
    print("night vision")
    camera.shutter_speed = 200000
    camera.exposure_mode = 
    'backlight'

    filename = 
     '/home/pi/picture_capture.jpg'
    camera.capture(filename)
    try:
      print("got the picture")
      file = open(filename)
      print(
       "saving it: %s" % now.time())

      ftp.storbinary(
      'STOR /IOT/%s_photo.jpg' % 
      now.time(), file, 1)

      file.close()
      print("done")
    except Exception as e:
      print(e)
    finally:
      print("finally")
      camera.stop_preview()
      ftp.close()
    print("waiting 20 min")
    sleep(20 * 60)

Observații

S-ar putea ca Raspberry PI să nu vă recunoască camera video. Pentru inițializarea driverului lansați următoarea comandă:

sudo modprobe bcm2835-v4l2

Pentru a rula aplicația, trebuie doar să înlocuiți datele de logare și site-ul ftp.

Lansați aplicația remote prin intermediul unui remote sharing cum este VNC Viewer în loc de SSH. Lansarea prin SSH va cauza oprirea aplicației în momentul unui timeout și nu cred că doriți să păstrați un SSH deschis pe toată perioada concediului.

În afară de soluția prezentată în acest articol, am mai folosit pentru fluxul de aer din acvariu o priză inteligentă ce se poate controla de pe internet.

Concluzie

Soluția de față este un simplu mecanism de monitorizare la îndemâna tuturor. Următorul pas ar fi controlul hranei și al luminii în acvariu. Vom reveni cu ea după următorul concediu.