luni, 26 iunie 2017

debug MQTT pe ESP8266, Domoticz si Raspberry Pi

Intr-un articol precedent am prezentat cum se trimit date de la un senzor cu ESP8266 catre serverul Domoticz, prin WiFi. Datele erau trimise prin MQTT, folosind brokerul MQTT mosquitto.

Daca spre exemplu avem o problema pe partea de MQTT si vrem sa o corectam, trebuie sa facem cumva sa vedem mesajele MQTT.

Dupa ce am instalat pe Rasberry Pi brokerul MQTT si clientul MQTT (apt-get install mosquitto mosquitto-clients), putem verifica functionarea brokerului:

-deschidem 2 ferestre PuTTY unde ne conectam la RPi (SSH)
-intr-una rulam  mosquitto_sub ca sa ne abonam la un topic si sa vedem mesajele



-in cea de-a doua rulam mosquitto_pub cu care publicam mesaje pe un anumit topic



Asa ne asiguram ca brokerul MQTT mosquitto functioneaza.

Dacalinia de comanda sperie lumea, un alt program interesant este MQTT.fx, are interfata grafica, este facut in Java si poti vedea ce se petrece pe MQTT. Publici si vezi mesaje, poti seta multi parametri ai conexiunii, te poti abona la multe topicuri etc.

E fain ca poti selecta cum sa vezi continutul mesajelor, spre exemplu JSON:




joi, 22 iunie 2017

ESP8266 MQTT Arduino Domoticz - home automation

Intr-un articol precedent am pus cateva detalii despre automatizarea casei, despre cipul cu WiFi integrat si pret mic ESP8266 (Domoticz, IoT si casa inteligenta).

De cand cipul ESP8266 a fost integrat in Arduino IDE, au aparut o multime de aplicatii, de automatizari, iar viata constructorului amator electronist :) s-a simplificat uimitor. Unii chiar folosesc acest cip ESP8266 fara partea lui de WiFi doar pt ca ofera putere de procesare la un pret mic.

Ideea cu automatizarea casei e simpla si te poate scapa de timpul pierdut pt diverse sarcini, timp care se aduna, iar daca aduni 1 minut de 60 de ori, iti iese numai bine o ora, ora pe care o petreci cu cei dragi:
-am un cip care citeste senzori si trimite datele prin reteaua deja existenta (aproape) in fiecare casa - cam fiecare casa are un ruter WiFi, deci o retea WiFi.
-acelasi cip poate primi comenzi prin aceeasi retea WiFi si poate actiona diverse relee, motorase, trimite comenzi prin infrarosu etc. Deci cipul ne spune diverse informatii si / sau asculta si executa comenzi. (sau poate executa local comenzi ifd informatiile pe care le are de la senzori).
 
-informatiile ajung la un sistem care le stocheaza si care poate decide ifd informatiile primite.

De exemplu:
-scade temperatura in casa sub 17 grade C (informatie de la senzori), se decide pornirea caldurii
-creste tempreatura peste 25 de grade C, se decide pornirea aerului conditionat si inchiderea jaluzelelor
-s-a detectat umiditate pe podea in subsol - o potentiala inundatie, se decide oprirea apei reci / calde si oprirea alimentarii cu energie electrica a subsolului   +  trimiterea unui SMS si email cu mesajul ca e o problema
 -contorul de gaz, cel de energie electrica, cel de apa rece sunt inregistrate local si poti analiza consumurile, le poti corela cu inregistrari de temperarura, poti intelege cum consumi si eventual poti lua masuri sa consumi cu cap, nu sa consumi aiurea doar pt ca iti permiti sa platesti sau ca ai de unde consuma - trebuie sa ai un dram de minte in plus de la tehnologie
-poti sa controlezi luminile in casa, sa ai detalii despre starea usilor, a geamurilor etc - un fel de sistem de alarmare
-sistemul de udat gazonul sau gradina pot fi automatizate complex, ifd de ora, temperatura, umiditatea solului etc (sau poti comanda tu de pe smart phone sa il uzi ATUNCI)
etc
etc

Sa vedem cum arata acest sistem:


Cipul (microcontrolerul cu WiFi) ESP8266 citeste datele de la senzori
Trimite datele prin WiFi catre un IP / port din LAN
Datele ajung la routerul WiFi
Routerul le da mai departe catre IP-ul specificat din LAN
Datele ajung la Raspberry Pi (RPi) unde ruleaza oaplicatie / server
RPi trimite datele aplicatiei cu portul specificat la inceput - aplicatia aleasa de mine este Domoticz - sever de home automation

Pentru a trimite date intre dispozitive cu putere de procesare redusa si pentru a nu consuma energie, a fost inventat un stardard - MQTT

Datele de la dispozitive sunt trimise unui broker MQTT intr-un format agreat. Dispozitivul publica (publish) datele pe broker pentru un anumit flux de date (topic). Daca dorim sa citim datele de la brokerul MQTT, trebuie sa ne abonam (subscribe) la broker si la un anumit flux de date (topic)

De exemplu un topic ar fi /sufragerie/temperatura/
Dispozitivul publica datele catre brokerul MQTT: /sufragerie/temperatura/20
Brokerul MQTT preia datele si le pune la dispozitia tuturor celor abonati (subscribed) acestui topic.

Un broker popular de MQTT este mosquitto. Datele de la broker sunt volatile, adica brokerul le publica dar nu le stocheaza, nu le proceseaza.

Daca dorim stocarea acestor date sau prelucrarea lor, trebuie sa folosim o aplicatie care se aboneaza la un topic si datele primite acolo le va stoca undeva, intr-o baza de date de exemplu. Din acest motiv am utilizat un server de automatizari - Domoticz. Domoticz se aboneaza la brokerul MQTT mosquitto si cand primeste date de la ESP8266, le scrie in baza de date. De acolo datele pot fi vizualizate in grafice, pe perioade de timp etc.

Instalare Domoticz pe Raspberry Pi
Instalare broker MQTT mosquitto pe Raspberry Pi

Acum vine partea de programare, sperietoarea tutror :). Din fericire, domeniul de home automation, Arduino si ESP8266 sunt niste chestii foarte populare printre constructorii amatori, asa ca, unii mai priceputi, au pus la punct ceva minunat, anume Easy ESP sau ESP Easy, nu mai stiu exact - vezi Let's Control It - ESP Easy.

E vorba de un soft care programat pe ESP8266 te ajuta sa configurezi ESPul dintr-o interfata grafica, din browserul de Internet, ce poti sa iti doresti mai mult :)

De aceea, pe ESP8266 am programat softul ESPeasy.

ESPeasy se gaseste pe GitHub si se compileaza / programeaza in Arduino IDE, programarea e simpla, urmati pasii de pe Let's Control It.

Pentru programarea ESPeasy versiunea R120 sub Arduino 1.8.3, trebuie ca biblioteca de functii "IRremoteESP8266 by Sebastien Warin, Mark Szabo..." sa fie versiunea 1.1.1, ultima versiune da eroare la compilare, probabil ca e ceva trivial de rezolvat, insa nu am avut timp de asa ceva.

Biblioteca de functii "IRremoteESP8266 by Sebastien Warin, Mark Szabo..." 
sa fie versiunea 1.1.1

Setari in Arduino IDE pentru un modul ESP8266 generic 
(verificat pe ESP-07)


Senzorii mei fiind afara si mai ales fara alimentare de la retea, ESPeasy e pe baterii (acumulatori litiu, 18650). Partea buna e ca in ESPeasy e optiune de functionare in mod de deepsleep, ceea ce prelungeste viata unui ESP8266 pe baterii la cateva luni chiar.

De asemenea am modificat acest soft (versiunea R120) pe baza celor gasite online si imi afiseaza starea bateriei (ESPeasy starea bateriei), asa pot sa stiu daca ma lasa bateria / acumulatorul, daca se incarca etc.


Putem lega la ESP8266 un senzor digital de temperatura DS18B20, apoi configuram ESPeasy sa il citeasca si sa trimita datele la Domoticz (prin MQTT) (tutorial Domoticz, ESPeasy si DS18B20)


Daca rulam ESPeasy acasa, in LAN, este ok dpdv al sigurantei, daca vrem acces din afara, din Internet, trebuie sa ne asiguram ca Domoticz este securizat (SSL, TLS) si ca ESP8266 foloseste aceasta autentificare, altfel ne expunem la riscuri.

Daca ai ajuns pina aici, daca ai reusit sa instalezi pe Rasberry Pi si sa programezi ESP8266, atunci deja ai pus temelia pentru un sistem care poate fi complex si util :)

(cele scrise mai sus nu se doresc a fi un tutorial pas cu pas pentru incepatori care aud acum prima data de Arduino, Rasberry Pi si microcontrollere, am incercat doar sa prezint o imagine globala asupra a ceea ce avem la dispozitie acum in 2017. Pentru orice intrebare, stiu pe cineva care a deschis un site unde se pot afla multe raspunsuri - google.com :) )

vineri, 16 iunie 2017

ESP8266 outdoor module solar powered - Domoticz, MQTT

English:
I put together a device for outdoor use: it is based on ESP8266 (in fact ESP-07 module) to send various environmental measurements over WiFi.
This device is powered from a Lithium element recovered from a laptop battery (18650 unprotected element). Also the device has a small solar cell to harvest energy during sun hours and to store it on the 18650 Lithium element to be used over the night.
The device is sending data in JSON format to an MQTT local broker on a Raspberry Pi clone board.
The device can measure the voltage on the battery (voltage divider), can use I2C, OneWire and so on - various sensors.
For the moment I can share some pictures and the code which is sending the ADC value (corresponding to the voltage on the 18650 battery). The PCB was not the greatest PCB done with toner transfer method, but I'll improve.
On the same Raspberry Pi clone, I run Domoticz home automation server to log data in a database. Domoticz, among many other wonderful things, can plot data in a nice looking format. I logged for instance the ADC read values from the moment I put there a fresh charged 18650 battery until the moment the battery was depleted, every 5 minutes I had a value read and sent to MQTT broker, then Domoticz plotted the values.
Arduino code is not my personal creation, I compiled code from a few sources, unfortunately I did not keep the track of these sources.
Below, at the end, you can see the plot of the logged data from the battery voltage (actually the readings from the ADC). It is interesting to see that while charging is complete, the battery management system will disconnect the 18650 battery, ESP8266 will start consumuing the power from the battery, when the voltage < 4.2V, charging will start again, therefore the saw tooth plot.


****************************************
Romana:
Am construit un aparat care poate fi utilizat in mediul natural: foloseste cipul ESP8266 (un modul ESP-07). Acest aparat trimite valorile diversilor parametri de mediu prin WiFi.
Aparatul este alimentat de la un element cu litiu 18650 recuperat dintr-un acumulator de laptop. De asemenea aparatul are un panou solar care incarca acumulatorul cu litiu.
Datele trimise de aparat sunt in format JSON si merg catre un broker local MQTT instalat pe o clona de placa Raspberry Pi.
Aparatul poate masura tensiunea de pe acumulator (cu un divizor rezistiv), poate utiliza senzori diversi (I2C, OneWire etc).
Pentru moment am doar poze cu aparatul si cod care trimite valoarea ADC (corespunzatoare tensiunii de la acumulator). Cablajul imprimat nu este bine realizat, e metoda cu transfer termic, insa invat si o voi imbunatati.
Pe clona Raspberry Pi ruleaza un server de home automation Domoticz care ia datele de la brokerul local MQTT si le afiseaza intr-un grafic (Domoticz poate face mai multe de atat).
Codul  Arduino prezentat mai jos nu este creatia mea, e format din parti de cod gasite pe Internet. Din pacate nu mai sursa tuturor acestor bucati de cod.
Mai jos, la finalul articolului, sunt graficele cu tensiunea pe acumulatorul 18650 (de fapt sunt valorile ADCului). este interesant de observat graficul dinte de fierastrau care reprezinta momentul cand incarcarea este finalizata si controllerul de incarcare permite consumul din acumulator. Cand tensiunea scade sub 4,2V, atunci controllerul incepe din nou incarcarea, se ajunge din nou la >4,2V, se conecteaza acumulatorul samd.


10cm X 10cm 


 
Reset button

Power stage (blue module) + 3V3 LDO (SMT) HT7333.
Partea de alimentare (modulul albastru) + 3V3 LDO (SMT) HT7333

Power controller (battery management system).
Controllerul de alimentare / incarcare 

 
LEDs on the BMS: Charged.
LEDurile pe controllerul de incarcare: Complet incarcat

LEDs on the BMS: Charging
LEDurile pe controllerul de incarcare: In curs de incarcare


***************************************************
#include
#include

const int AnalogIn  = A0;  //ADC pin
const int Enable_Div = 14;  //enable signal for voltage divider

int readingIn = 0;

const char* ssid = "SSID_aici"; //SSIDul de la reteaua unde vrem sa ne conectam
const char* password = "parola_aici"; //parola retelei
const char* mqtt_server = "192.168.IP.SERVER"; //IPul brokerului MQTT

WiFiClient espClient;
PubSubClient client(espClient);


long lastMsg = 0; //pt intervalul de trimitere date
char msgBatt[50]; //pt mesajul MQTT pt valoarea ADC

void setup() {
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
  pinMode(Enable_Div, OUTPUT); //pinul de activare al divizorului rezistiv
}

//aici incercam sa ne conectam la WiFi
void setup_wifi() {

  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

//asta proceseaza mesajele MQTT venite pe un topic la care suntem abonati
//in cazul de fata este domoticz/out
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Mesajul primit de la topicul [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (client.connect("ESP8266Client")) {
      Serial.println("connected");
      // Once connected, publish an announcement...
      client.publish("domoticz/in", "ESP8266 conectat");
      // ... and resubscribe
      client.subscribe("domoticz/out");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}
void loop() {

  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  long now = millis();  
  if (now - lastMsg > 300000) { //daca au trecut 5 minute, publica date noi
    lastMsg = now; 
    digitalWrite(Enable_Div, HIGH);
    delay(2000);
    //citim analog input value     
    Serial.print("ADC value:");
    readingIn = analogRead(AnalogIn);
    Serial.println(readingIn);
    delay(1000);
    digitalWrite(Enable_Div, LOW);
        
    //pregatim mesajul MQTT cu valoarea ADC in format JSON
    snprintf (msgBatt, 75, "{ \"idx\" : 6, \"nvalue\" : 0, \"svalue\" : \"%s\" }", String(readingIn).c_str());
    Serial.println(msgBatt); //sa vedem ce trimite
    client.publish("domoticz/in", msgBatt);
    }
}

*********************************************************

logged data during charging / graficul in timpul incarcarii

battery level is going down / descarcare

battery went so low that the ESP8266 cannot receive enough power
bateria s-a descarcat complet

after battery was discharged, I reconnected the charger, thus the ramp-up shape
dupa descarcare, am conectat incarcatorul, de unde si forma de rampa crescatoare



vineri, 9 iunie 2017

WeMos D1 Mini sub Arduino IDE si Windows 10

Daca doriti sa experimentati cu IoT sau cu un microcontroler cu WiFi integrat, o puteti face simplu cu un modul WeMos D1 Mini. Acest modul are un conector micro USB si mai are pe placa tot ce ii trebuie ca sa functioneze de sine statator. Cei de la WeMos au proiectat acest modul in ideea Arduino, adica se pot suprapune unele peste altele diverse module cu diverse functii (senzori, intrerupatoare, ecran OLED etc) astfel ca nu este necesara prea multa munca de lipire a componentelor electronice (la moculele cumparate de mine, trebuie lipiti conectorii).

Modulul WeMos D1 Mini vine in punga de protectie ESD cu 3 versiuni de conectori

Dimensiuni modul WeMos D1 Mini: 3,5 x 2,5 cm

Aici se vede conectorul micro USB si restul componentelor

Modulul si cele 3 versiuni de conectori

Daca alegem sa suprapunem module peste WeMos D1 Mini, 
atunci trebuie sa lipim conectorii cu pini lungi 

Adaugat 19.06.2017: WeMos are o strategie similara cu Arduino: ei produc hardware, dar in sistemul open hardware, open source. Nu am cercetat atent modulele WeMos cumparate initial, erau mai ieftine. Cele de la WeMos costa putin mai mult, dar arata altfel (componentele sunt montate pe o singura fata a cablajului, nu exista ecran RF peste ESP8266EX, exista conector pentru antena exterioara, foloseste alt cip pentru USB-serial etc).

Stanga: clona de WeMos, dreapta WeMos original. Ambele functioneaza, nu e vorba de asta. 
Daca doresti antena externa, doar originalul are conector de antena (IPX).

Daca se doreste antena, acest rezistor de 0 Ohm trebuie dezlipit, 
rotit 90 de grade la stanga si lipit pe acel pad.
In chenarele galbene: la stanga - ESP8266EX, dreapta sus Silicon Labs SIL2104 
si dreapta jos memoria flash Winbond W25Q128FVSG (128Mb sau 16MB).
Deci modulul WeMos poate fi reprogramat si on the air (OTA)
 

Programele se pot scrie usor in Arduino IDE si se incarca prin USBul mai inainte mentionat.

Sub Windows 10 lucrurile merg extrem de simplu, repede si precis:

-instalare Arduino IDE -> https://www.arduino.cc/en/Main/Software
(sub Windows 10 am ales "Windows app")



-adaugare placa WeMos D1 Mini in Arduino IDE:
*in arduino IDE, mergi la File -> Preferences 
*in campul "Additional boards manager URLs" adauga calea de mai jos apoi click pe OK:
   http://arduino.esp8266.com/stable/package_esp8266com_index.json
*apoi Tools -> Boards -> Board manager, acolo selectam  "esp8266 by ESP8266 Community" si instalam
*apoi Tools -> Boards si acolo selectam din lista "WeMos D1 R2 & mini"



-instalare driver USB serial - pe placa WeMos D1 Mini este un convertor CH340 (USB - serial (TTL)) produs de WCH, Driverele le gasim pe pagina producatorului:

http://www.wch.cn/download/CH341SER_EXE.html

Dupa instalarea si conectarea placii WeMos D1 Mini la calculator, in lista de dispozitive apare si placa, ma rog, convertorul USB serial CH340:


Nu mai ramine de facut decat sa conectam placa WeMos D1 Mini la calculator cu un cablu micro USB (folosit uzual la date / incarcare la telefoanele inteligente) si sa compilam / incarcam un program de test pe placa.

Am ales din File -> Examples -> SD(esp8266) -> CardInfo pentru ca va comunica pe interfata seriala (chiar daca nu am niciun card SD conectat la WEMos D1 Mini).

Compilam, selectam portul corect (Tools -> Port -> COM4 - asta e in cazul nostru), incarcam (upload), apoi selectam din Tools -> Serial Monitor si vedem ce ne spune placa. Placa ne spune ca nu gaseste niciun SD card si ne recomanda ce sa verificam. Ceea ce inseamna ca programul a fost incarcat, ca placa ruleaza corect programul - adica functioneaza corect totul.


Asadar avem tot lantul de programare, trebuie doar sa incepem sa programam. Succes!

joi, 1 iunie 2017

Cum reparam stergatoarele de parbriz

Poate titlu corect ar fi cum reconditionam stergatoarele de parbriz. Dupa 6 ani, stergatoarele de parbriz au inceput sa lase urme, sa nu mai stearga complet parbrizul.

Am luat un stergator si l-am analizat la lupa caci nu se simtea nimic deformat sau rupt la cauciucul care sterge apa de pe parbriz.



La lupa am observat ca intr-adevar in zona unde stergatorul nu isi facea treaba, era un fel de defect, cauciucul era deformat.

Profilul cauciucului este in forma de virf de sageata:


Daca am putea taia doar virful acestui profil de cauciuc pe toata lungimea stergatorului, oare ar mai functiona stergatorul?

Am dat peste un dispozitiv care poate face acest lucru - EcoCut (nu am nicio loegatura cu producatorul, cred doar ca e un dispozitiv interesant si util).


Acest dispozitiv are in interior o lama care taie doar vifrul cauciucului.


De asemenea dispozitivul iti permite sa tai 2 tipuri de cauciuc de stergator:

In mediul on-line, parerile sunt impartite - unii sunt bucurosi ca au reparat stergatoarele, altii nu sunt fericiti. Acesti din urma au mentionat ca stergatoarele "reparate" lasa urme si e mai rau decat inainte.

Mi-am adus aminte ca de fiecare data cand taiam cauciuc, lama subtire a cutitului tindea sa se opreasca in cauciuc si taietura iesea zimtata.

Asa ca am luat stergatorul, l-am spalat cu apa calda si sapun (asa am obinut un cauciuc mai moale) si apoi inainte de taiere am uns cauciucul cu sapun lichid.

Cu grija, aplicand forta constanta, am reusit sa tai 99% bine :), la capatul final am avut o scapare:


In dreapta - capatul de unde am inceput taierea, in stanga, capatul final, unde am scapat putin taierea, dar am corectat cu o forfecuta:

 
Acum la prima, ploaie, pot spune ca merge bine stergatorul reconditionat. EcoCut costa 12 EUR, plata prin PayPal, vine la posta de cartier, livrat din Germania.