Posted on Oct 24, 2017 | 0 comments

So yeah. Mi-am pus Linux pe priză.

Acum o lună și ceva mi-am cumpărat două prize SONOFF S20 de la ITEAD. Au WiFI și poți prin IoT să controlezi dispozitivele din casă cu ajutorul unei aplicații Android. Dar normal că e mai amuzant să pui Linux pe priză și să faci Telnet pe ea. Eventual SSH dacă găsesc un firmware mai bun.

Ai nevoie de un convertor FTDI, un cablu MiniUSB, cabluri-mamă, patru pini, niște cositor și un pistol de lipit. Convertorul a costat cam $1 și e un FTDI FT232RL USB To TTL de 3,3V. Azi mi-a ajuns prin poștă așa că m-am pus pe lucru.

Priză WiFi SONOFF S20, cabluri-mamă și FTDI FT232RL USB To TTL de 3,3V.

Ai nevoie de patru cabluri de culori diferite. Convertorul are un switch care comutează de la 5V la 3,3V. Lăsați-l pe 3,3 că altfel riscați să vă prăjiți nu doar convertorul dar și priza sau laptopul. Inserați cablul USB în mufa convertorului.

Cablul negru e conectat la ”GND”, cel portocaliu la pin-ul ”5V”, cel galben la ”TXD” iar cel alb la ”RXD”.

Acum desfacem priza. Sub sticker-ul imprimat cu roșu de pe spate e un șurub care trebuie desșurubat. Apoi e chestie de inserat lama unui cuțit prin fantee laterale ale prizei pentru a o face să se desfacă cu grijă. Plăcuța imprimată din interior e și ea prinsă cu două șuruburi care vor trebui desfăcute.

Ce ne interesează sunt aceste patru găuri care corespund fiecare câte unui pin al convertorului.

Acum avem nevoie de pini pe care să-i sudăm pe placa itegrată. Am găsit ceva piese vechi dintr-un laptop antic și am folosit ciocanul de lipit pentru a scoate de pe una din ele un modul cu patru pini.

Am lipit modulul cu cositor pe plăcuță.

Not a great soldering job but it will do.

Rezultatul final arată așa:

Acum conectăm cablurile astfel: GND la GND, VCC la 5V, TXD la RDX și RDX la TXD.

Când băgați prima oară cablul în laptop se va aprinde becul verde:

Ce trebuie acum să faceți este să setați dispozitivul în modul programabil. Apăsați pe butonul din mijlocul plăcii (unul singur există oricum) și ținând apăsat pe el scoateți cablul USB din laptop. Țineți încă apăsat și așteptați 2-3 secunde după care introduceți cablul înapoi; încă două secunde și puteți da drumul. Culoarea becului ar trebui acum să fie albastră.

Dacă dați un lsusb în Terminal ar trebui să fie deja detectat controllerul:

Dați un dmesg | grep tty ca să verificați pe ce port USB e priza (ttyUSB0, ttyUSB1, ttyUSB2 etc). În cazul meu a fost vorba de /dev/ttyUSB0. Apoi deschideți pagina asta, copiați codul scriptului python într-un fișier pe care-l redenumiți în esptool.py și-l faceți executabil cu chmod +x esptool.py. E nevoie să aveți python și pip instalate. Ulterior dați un pip install pyserial pentru că vom avea nevoie de pachet.

Downloadați firmware-ul de aici. Am ales să experimentez întâi cu ESP Easy versiunea 2.0.0 dev 12. Dezarhivați și plasați într-un folder fișierul ESPEasy_v2.0.0-dev12_normal_1024.bin. Puteți ulterior lansa scriptul făcut executabil mai sus cu drepturi de admin:

sudo ./esptool.py --port /dev/ttyUSB0 --baud 115200 write_flash 0x000 ESPEasy_v2.0.0-dev12_normal_1024.bin -fs 8m

E nevoie ca baud-ul să fie neapărat de 115200.

Instalarea durează circa un minut. După ce noul firmware este instalat puteți deconecta și reconecta cablul USB la laptop. Printre rețelele WiFi vă va apare una numită ESP_Easy_0. Conectați-vă la ea cu parola configesp.

Acum deschideți un browser și navigați la 192.168.1.205. Ar trebui să vedeți așa ceva:

Vă conectați din nou la rețeaua voastră WiFi apoi click pe ”Proceed to main config” ca să alegeți routerul vostru WiFi și să introduceți parola de logare în rețea. Firmware-ul are o mulțime de opțiuni pe care le voi discuta mai încolo. Ideea e că puteți schimba IP-ul prizei (eu i l-am setat la 192.168.1.22) sau să-i setați unul dinamic prin DHCP, atribuit de router, să îi schimbați numele, ba chiar să setați un fallback address (un al doilea router sau a doua bandă a routerului) care să fie folosită în caz că prima eșuează. Cum am două benzi – una de 2,4 și una de 5GHz în router, le-am setat pe acestea. Priza are propriul sistem de info, logging, îi puteți seta parolă și comenzi pentru buton. Suportă notificări prin e-mail sau Buzzer, știe Telnet, salvează configurația în format .BIN downloadabil, suportă update de firmware direct din interfața web, poate lucra cu protocolul MQTT pentru a primi comenzi de pornire/oprire. Instalați OpenHAB și apoi un client OpenHAB pentru Ubuntu cu

sudo apt install mosquitto mosquitto-clients

Apoi puteți seta cofigurații de tipul

# mosquitto_sub -h my.mqtt.server -t "#" -v
/sonoff-s20/Relay/State 1
/sonoff-s20/Relay/State 0

cu care să manevrați apoi din linie de comandă priza folosind

# mosquitto_pub -h 192.168.1.22 -t "/sonoff-s20/gpio/12" -m "1"
# mosquitto_pub -h 192.168.1.22 -t "/sonoff-s20/gpio/12" -m "0

după ce în prealabil ați făcut niște modificări de configurație din interfața web. Am să caut un firmware care să aibă și SSH eventual.

De menționat că odată schimbat frmware-ul, cel vechi – din câte am înțeles – nu mai poate fi pus înapoi.

În interfața web putem schimba IP-ul, numele prizei și-i putem seta o parolă de administrare.

La ”Devices” e nevoie să adăugați următoarele două task-uri:

…în așa fel încât rezultatul final să arate așa:

Apoi din mediul ”Tools” > ”Advanced” bifăm ”Rules”…

…și ne va apare un nou meniu numit ”Rules” în care introducem următoarele linii, bazându-ne pe ce-am creat cu un pas mai sus:

On Button#State=1 do
if [Relay#State]=0
gpio,12,1
else
gpio,12,0
endif
endon

Cam așa:

Opțional puteți seta notificări prin e-mail (nu știu dacă setările mele sunt corecte, nu le-am testat încă), activa Telnet și activarea prin intermediul unor servicii.

E mișto să știi că poți da ping la priză și că are IP static. Poți astfel seta din router un forwarding și să accesezi priza din afară dacă setezi o adresă DDNS. Gen să-ți pornești aerul condiționat dacă e prea cald afară sau să setezi să-ți facă o cafea la o anumită oră.

Priza știe printre altele de NTP, îți afișează uptime-ul, poate stoca fișiere (habar n-am în ce cuantum), salva log-urile pe un server remote și altele. De menționat că la ”Hardware Settings” am făcut următoarele setări:

Mai sunt și alte firmware-uri pe care le puteți pune pe dispozitiv. Atenție doar cum conectați pinii pe placă, că dacă nu faceți legătura corect riscați să ia foc ceva.

Priza o pot controla de exemplu prin HTTP. La “Rules” am adăugat următorul set de reguli care-mi permit să pornesc și opresc priza prin comenzi browser:

On start do
gpio,12,1 //start
endon


On stop do
gpio,12,0 //stop
endon

Și apoi tot ce mai trebuie să fac este să deschid Firefox și să merg la următoarea adresă locală:

http://192.168.1.22/control?cmd=event,start

pentru a porni priza și – automat – dispozitivele conectate la ea. Pentru oprire folosesc

http://192.168.1.22/control?cmd=event,stop

We all love fresh coffee in the morning.

Mai mult, dat fiind că priza are temporizator, pot crea event-uri care să dureze o anumită perioadă de timp. Să zicem că dimineața vreau să-mi fac o cafea și știu că durează fix 7 minute până ce aparatul de cafea termină de fiert apa și făcut cafeaua. Pot seta ca priza să pornească la o anumită oră a dimineții, să aștepte 7 minute apoi să se închidă singură, deconectând aparatul de cafea de la curent.
În exemplul de mai jos folosim comenzile HTTP de mai sus pentru a porni priza și a o lăsa activă 7 minute, după care se va închide singură:

On startcafea do
gpio,12,1 // porneste aparatul de cafea
timerSet,1,420 // 60×7=420 de secunde
endon

On stopcafea do
timerSet,1,0 // poti opri procesul manual inainte ca
endon // cele 7 minute să treacă

On Rules#Timer=1 do
gpio,12,0 // opreste aparatul de cafea
endon

Poți apoi seta un cronjob care să lanseze elinks sau lynx către adresa de start. Sau – și mai bine – curl, ca să închidă task-ul automat după lansare, să nu rămână procese aiurea care rulează în background:

curl http://192.168.1.22/control?cmd=event,startcafea

la ora 6 dimineața și pe când te vei trezi vei avea cafea caldă în bucătărie. Din câte știu priza are și un scheduler intern, așa că nu e nevoie de cron să-i dea comenzi la ore exacte. Adăugăm următoarele rules în meniul de configurare al prizei:

On Clock#Time=All,05:45 do // start in fiecare zi la 5:45 dimineata
gpio,14,0
endon

Sau în zile specifice, precum duminica:

On Clock#Time=Sun,08:30 do // doar duminica, la 8:30 dimineata
gpio,14,0
endon

Între anumite ore ale zilei:

On Pir#Switch=1 do
If %systime% < 16:00:00 // start la 16:00 
Gpio,16,1 
Endif If %systime% > 16:33:00 // stop la 16:33
Gpio,16,1
Endif
Endon

Ideea e că poți porni așa aparatul de aer condiționat vara, închide sau deschide dispozitive prin casă din alte părți ale țării folosind un VPN (sau prin DDNS cu port forwarding în router dacă aveți curajul) sau seta ca atunci când cineva dă click pe un link de la voi de pe site priza să activeze un bec în casă vreme de o secundă, ca să fiți notificați. Se pot face multe chestii: activa camere de supraveghere între anumite ore, închide televizorul sau frigiderul, încălzi supa în cuptorul cu microunde cu 2 minute înainte să ajungeți lihniți de foame acasă, reseta PC-uri la care n-ai acces SSH sau web și altele.

O priză ITEAD SONOFF S20 costă undeva între $10 și $16. Eu am luat deocamdată doar două, de test, dar n-ar strica să-mi automatizez prin scripturi BASH toată aparatura din casă. Fiecare priză suportă un set de 4 rules așa că o puteți pune să facă 4 chestii diferite cu aparatul conectat la ea. Chestia faină e că e nevoie doar de un banal prelungitor ca să pui una din prize să facă mai multe lucruri: legi prelungitorul la priză, bagi în prelungitor aparatul de cafea, aparatul de prăjit pâine și o lampă mică iar pe când te scoli ai și pâine proaspăt-prăjită, și cafea caldă și e și lumină în bucătărie.

Pot de exemplu cupla becul bluetooth cu difuzor la prelungitor și să am nu doar lumină în bucătărie pe când mă trezesc în zori dar să fie difuză, albastră dacă vreau, să se intensifice gradat pe parcursul a 30 de minute și în fundal să meargă ceva MP3 liniștitor. Priza activează filetul becului care e setat manual pe ”On”, apoi serverul din NAS care are un modul Bluetooth înfipt în USB-ul din spate îi dă un play slayer_raining_blood.mp3 cu output-ul audio setat pe becul bluetooth (sox și libsox-fmt-mp3 instalate ca să funcționeze play cu MP3-uri; alternativ folosiți mplayer). Să-mi citesc știrile de dimineață cât beau cafeaua într-un mediu relaxant.