Cum să-ți deschizi poarta de pe Internet

Magazia cercetașilor din Alba Iulia este în casa familiei mele. Din iunie nu mai locuiește nimeni tot timpul acolo, așa că am luat-o ca o provocare personală să găsesc o soluție de acces facilă pentru lideri la materiale, care să nu implice nici multe chei, nici o singură cheie plimbată pe la toată lumea în funcție de nevoie, soluții care, deși funcționale, sunt complicat de gestionat.

Așa că mi-am propus ca obiectiv să creez un sistem care să le permită tuturor liderilor să deschidă poarta de la curte … de pe Internet, mai concret din aplicația web pe care o folosim pentru toate lucururile legate de Centrul Local.

Mi-a luat câteva luni să leg toate lucrurile împreună într-un sistem funcțional, pentru că nu am niciodată suficient timp dar, cu cele câteva sugestii de mai jos, ar trebui să vă puteți pune la punct un sistem asemănător într-un weekend – mai ales dacă aveți la îndemână și o bormașină :)

Partea cu poarta

Prima problemă și cea în care nu aveam experiență de niciun fel a fost cea a yalei. Trebuia să pot să folosesc o yală care să aibă și cheie clasică, care să funcționeze și atunci când nu este curent, dar să poată fi acționată și electric. Am căutat un pic pe Internet și am găsit o firmă specializată de așa ceva la Cluj, care se numește YLI.

Am găsit repede la ei ce căutam, o yală electromagnetică cu buton pentru exterior. Pentru că yala are, evident, un electromagnet, ea trebuie alimentată cumva, așa că am luat de la ei și o sursă de alimentare potrivită.

Pe scurt, dacă yala e sub tensiune (în priză) ea acționează electromagnetul care declanșează un mecanism și trage zăvorul. Yala trebuie alimentată doar atunci când se dorește deschiderea ei, pentru câteva secunde. Conceptual, problema asta se rezolvă cu un întrerupător. În circuite, un întrerupător care la rândul lui primește o comandă electrică (în cazul nostru, de pe Internet) se numește releu. Și, desigur, YLI are și relee pentru astfel de aplicații.

Ca povestea asta să și funcționeze, nu doar să pară inteligentă trebuie ca sursa, releul și yala să fie compatibile electric (adică să funcționeze la aceeași tensiune și sursa să dea suficient curent pentru yală). Componentele de mai sus le-am ales să fie compatibile.

Până aici, costurile sunt cam de 250 de lei, poate un pic mai mult în funcție de soluția de livrare (eu am ales curier după ce am mers până la sediul firmei și n-am găsit pe unde să intru :). Plus o vânătaie pe picior dacă vă scăpați yala pe picior, că-i grea. Nu mă întrebați de unde știu.

Partea cu Internet-ul

Cu partea mecanică și aproape toată partea electrică rezolvate, mai aveam nevoie de o soluție de comandă electronică, prin care să fac legătura dintre Internet și releu.

Aș putea să intru în mai multe detalii, dar cred că e suficient să zic că cele mai comune două soluții acum pentru hobby-iștii din România fără foarte mult timp la dispoziție sunt Arduino și RaspberryPi. Aveam câte unu din amândouă acasă, am ales Raspberry pentru că am considerat că e mai ușor de rezolvat partea de conexiune în rețea (la Arduino îți trebuie un shield special și e mai mult cod de scris), dar oricare soluție poate funcționa la fel de bine (și ambele sunt chiar overkill un pic).

RaspberryPi (dreapta), plăcuța cu releu de la YLI (stânga față) și conectorii de la tranzistor.
RaspberryPi (dreapta), plăcuța cu releu de la YLI (stânga față) și conectorii de la tranzistor.

Ca și costuri, aici e mai greu de estimat că aveam deja lucrurile cumpărate, dar un RaspberryPi B V1, ca cel pe care l-am folosit eu era undeva la 170 de lei, un alimentator (merge orice alimentator de telefon mobil mai nou) am găsit cu vreo 50 de lei. Mai trebuie niște cabluri de conexiune și un cablu de rețea, pe care presupunând că nu le ai deja ajungi la 250 de lei și pe partea asta.

RaspberryPi-ul este în esență un calculator, cu mufă de rețea cu tot, deci se conectează ușor la Internet și poate comunica cu server-ul pe care avem aplicația noastră de gestiune. Deci și problema asta este rezolvată.

Mai trebuia rezolvată problema că releul ce-l cumpărasem (numai de-alea aveau la YLI) vrea comandă de 12V și RaspberryPi poate da comenzi doar pe 3.3V și pe 5V. Problema asta se rezolvă ușor cu un tranzitor (sau elegant cu un alt releu, mai potrivit – am ales varianta ușoară de data asta).

Nu se poate post tehnic fără schemă :)
Nu se poate post tehnic fără schemă :)

Ca să se prindă frumos, cu șurub, toate firele (vezi poză), a fost nevoie să prind de o plăcuță tranzistorul, rezistența aferentă pentru comanda de la tranzistor și terminalele cu șurub.

La RoboFun (care sunt prietenii noștri de la colaborarea pe care ne propusesem să o facem de UP) găsiți cam de toate, iar pentru ce nu au ei – Internet sau magazinul de componente electronice preferat.

Software

În software, fiecare framework sau limbaj de progamare se prezintă cu un Hello world!, un progrămel exemplu care demonstrează cum se face cel mai elementar lucru în acel sistem.

Pentru Raspberry, echivalentul Hello World! este aprinsul unui led, o aplicație absolut identică cu activatul unui releu. De aceea, progrămelul în Python este foarte, foarte simplu, l-am comentat mai jos.

# releu.py

import RPi.GPIO as GPIO

# se initializeaza pin-ul 12 pentru output, initial 0 logic (low)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.OUT, initial=GPIO.LOW)

# se pune 1 logic (high) pe pin-ul 12 (comanda)
GPIO.output(12, GPIO.HIGH)

# asteptam 2 secunde. Manualul spune ca orice mai mult de 8 strica yala
import time
time.sleep(2)

# se face curatenie; comanda trece automat pe 0 (low) pin-ul 12
GPIO.cleanup()


De fiecare dată când programul rulează, electromagnetul se alimentează pentru 2 secunde, lucru care trage zăvorul. Zăvorul rămâne pe poziția deschis până poarta se închide din nou, astfel fereastra de timp în care se poate deschide poarta este nelimitată, nu doar cele 2 secunde.

Partea asta e un pic mai tehnică, pentru că pe măsură ce înaintăm spre Internet, sistemele devin mai complexe. Aveam mai multe variante pentru a lega server-ul de aici de server-ul nostru din Internet, dar soluția pe care am ales-o e una pe care-am mai folosit-o și la alte sisteme similare, la care vrem să ne putem conecta dar care nu au un IP propriu sau un uptime garantat: VPN (cu OpenVPN)

Astfel de fiecare dată când pornește (după o pană de curent, spre exemplu) RaspberryPi-ul intră într-un VPN gestionat de server-ul nostru. Astfel, există o cale garantată și privată de comunicare între cele două.

Acum, orice trebuie să fac este să deschid o conexiune ssh către Raspberry de pe  server-ul nostru, și să rulez progrămelul de mai sus.

Dar planul original era să pot apăsa un buton în interfața aplicației și să se deschidă poarta, adică cam așa:

Click the button
Click to open … the gate

Pentru această bucățică de puzzle am folosit fabric, un wrapper high-level peste ssh pentru python, într-un view Django. În esență, tot ce face comandă fabric este:

# fabfile.py
from fabric.api import run, env, cd
from django.conf import settings


def open_gate():
    with cd("/home/pi"):
        env.password = settings.GATEKEEPER_CONNECTION_PASSWORD
        run("sudo python releu.py")

Lecții învățate, distracții și îmbunătățiri

În mod evident, acesta nu este un proiect profesionist, în care să mă fi aplecat cu atenție pe partea de planificare și execuție. Am lucrat în weekend-urile în care am ajuns la Alba și scopul a fost să satisfac o nevoie imediată a noastră, a cercetașilor cu nevoie de acces la magazie, în cel mai scurt timp.

A fost un proiect distractiv din mai multe puncte de vedere – o dată că e o aplicație care are nevoie de de toate – de la ciocan și bormașină la high level python wrappers peste ssh :). Apoi, nu știu câtă lume poate spune că și-a conectat laptopul la poarta de la curte :).

Laptop + poartă = awesome
Laptop + poartă = awesome

Am învățat multe lucruri, de la mecanică (am stat o seară întreagă să înțeleg cum funcționează yala, înainte să mi-o scap pe picior) la probleme ceva mai filosofic-tehnice, spre exemplu care este varianta de preferat pentru o aplicație client / server în care server-ul e în spatele unui NAT.

Ca de obicei, scopul acestui post este să arate că unele lucruri sunt mult mai simplu de realizat decât pare inițial și mult mai la îndemâna oricui e dispus să încerce. Dacă pot să vă sprijin cu ideile voastre, dați-mi un semn și, în măsura în care știu și pot, dau cu plăcere o mână de ajutor.

3 comentarii la „Cum să-ți deschizi poarta de pe Internet”

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *

Acest site folosește Akismet pentru a reduce spamul. Află cum sunt procesate datele comentariilor tale.