Publié le

Netatmo et ESP partie 2

Une seconde partie n’était pas prévue, mais Mathieu (ouais c’est un blog de cuisine) c’est lancé dans l’aventure et du coup m’a fait pas mal retravailler mon code !

Du coup, j’ai repris mon code php pour l’importation des données Netatmo et ajouter la pluviométrie (Que je vais devoir aller ajouter dans Station météo maison couplée à une station Netatmo Part. 1 ça sera donc la partie 2).

Donc pour commencer, il faut récupérer les infos sur la pluviométrie. J’avais déjà identifié mon module, donc petit tour sur dev.netatmo.com ;

For Weather Station :

  • max -> Temperature, CO2, Humidity, Pressure, Noise, Rain (if module_id is a rain sensor), WindStrength, WindAngle, GustStrength, GustAngle, date_max_gust (if module_id is a Wind Gauge)
  • 30min, 1hour, 3hours -> Temperature, CO2, Humidity, Pressure, Noise, min_temp, max_temp, min_hum, max_hum, min_pressure, max_pressure, min_noise, max_noise, sum_rain (if module_id is a rain sensor), WindStrength, WindAngle, GustStrength, GustAngle, date_max_gust (if module_id is a Wind Gauge)
  • 1day, 1week, 1month -> Temperature, Co2, Humidity, Pressure, Noise, min_temp, date_min_temp, max_temp, date_max_temp, min_hum, date_min_hum, max_hum, date_max_hum, min_pressure, date_min_pressure, max_pressure, date_max_pressure, min_noise, date_min_noise, max_noise, date_max_noise, date_min_co2, date_max_co2, sum_rain (if module_id is a rain sensor), WindStrength, WindAngle, GustStrength, GustAngle, date_max_gust (if module_id is a Wind Gauge)

Donc, on peut en mettant des timers  récupérer le « sum_rain » !

Allez hop on intègre du code : (je ne rebalance pas tout hein)

$pluvio=$json_devices["body"]["modules"][1]["_id"];

$h_moins_1 = time() - 3600;
$hier = time() - 24* 3600;

$url_pluvio_h = "https://api.netatmo.net/api/getmeasure?access_token=" .  $params['access_token'] . "&device_id=" . $module_interne . "&module_id=" . $pluvio . "&scale=5min&type=sum_rain&date_begin=". $h_moins_1;
$pluvio_h = file_get_contents($url_pluvio_h);   

$url_pluvio_j = "https://api.netatmo.net/api/getmeasure?access_token=" .  $params['access_token'] . "&device_id=" . $module_interne . "&module_id=" . $pluvio . "&scale=30min&type=sum_rain&date_begin=". $hier;
$pluvio_j = file_get_contents($url_pluvio_j);

Donc là, je définit mon module pluvio (le mien est 1, celui de Mathieu est 3 ou 4).

Je définit $h_moins-1 et $hier en timestamp pour ma requête (Je veux le cumul sur la dernière heure et sur les dernières 24h).

Comme pour les autres mesures, il faut attaquer le découpage (et c’est la fête !) la sortie donne un truc du style :

{"body":[{"beg_time":1446581259,"step_time":300,"value":[[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0]]}],"status":"ok","time_exec":0.012279987335205,"time_server":1446584710}

Ce qui nous intéresse c’est le cumul de

[[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0],[0]]

Allez hop on découpe et on somme les valeurs !

$pluvio_h_decoupe = substr($pluvio_h,57,1000);
$recup1_pluvio_h = explode("}", $pluvio_h_decoupe);
$recup2_pluvio_h = explode("[",$recup1_pluvio_h[0]);
$sum_pluvio_h = 0;
for ($i=0; $i<count($recup2_pluvio_h); $i++) {
$mesure = explode("]",$recup2_pluvio_h["$i"]);
$sum_pluvio_h += $mesure[0];
}

Et on fait pareil pour la pluvio des dernières 24h.

On ajoute ensuite les sommes dans la chaîne à afficher pour obtenir en sortie notre fichier out.txt qui ressemble à ça :

[21.1n635n74n1017.4n45n14.8n91n0n0[

Comme je suis joueur, avant de donner mon code Arduino, je vais vous montrer le résultat qu’on souhaitait :

Donc en gros, toutes les 10 secondes on alterne l’affichage intérieur/extérieur dans un boucle de 3 rotations avant mise à jour des données.

J’ai du formater un peu l’affichage pour la pression et la pluviométrie :

#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <ESP8266WiFi.h>

LiquidCrystal_I2C lcd(0x3F, 20, 4);

const char* ssid     = "Votre SSID";
const char* password = "MDP Wifi";

const char* host = "192.168.1.50";

void setup() {
  Serial.begin(115200);
  delay(10);
  Wire.begin(0,2);
  lcd.begin();
  lcd.backlight();
  // We start by connecting to a WiFi network

  Serial.println();
  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());
}

int value = 0;

void loop() {
 
  ++value;

  Serial.print("connecting to ");
  Serial.println(host);
  
  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }
  
  // We now create a URI for the request
  String url = "/Netatmo/out.txt";
  
  
  Serial.print("Requesting URL: ");
  Serial.println(url);
  
  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");
  delay(10);
  String line = "";
  // Read all the lines of the reply from server and print them to Serial
  while(client.available()){
    line = client.readStringUntil('\r');
   }

char messageChar[500]; 
  line.toCharArray(messageChar,500);
  
  char dlm[] = "[";
            int cnt = 0;
            char* tab[255] = { 0 };
            char *pch = strtok(messageChar, dlm);
            while ( pch != NULL ) {
              if (cnt < 60) {
              tab[cnt++] = pch;
              } else {
              break;
              }
            pch = strtok (NULL, dlm);
            }
 
  
  char *chaine = tab[1];

  char dlm2[] = "n";
            int cnt2 = 0;
            char* tab2[255] = { 0 };
            char *pch2 = strtok(chaine, dlm2);
            while ( pch2 != NULL ) {
              if (cnt2 < 60) {
              tab2[cnt2++] = pch2;
              } else {
              break;
              }
            pch2 = strtok (NULL, dlm2);
            }
String pressionStr = tab2[3];
int pressionStrLength = pressionStr.length()+1;
char pressionStrChar[pressionStrLength];
pressionStr.toCharArray(pressionStrChar,pressionStrLength);
int pression = atoi(pressionStrChar);

String preci_hString = tab2[7];
float preci_h = preci_hString.toFloat(); 

String preci_jString = tab2[8];
float preci_j = preci_jString.toFloat(); 

if (tab2[1] > 0) {
for (int i = 0; i<3; i++)
{
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Interieur");
  lcd.setCursor(0,1);
  lcd.print("T: ");
  lcd.print(tab2[0]);
  lcd.print(char(223));
  lcd.print("C");
  lcd.setCursor(0,2);
  lcd.print("CO2: ");
  lcd.print(tab2[1]);
  lcd.print("ppm");
  lcd.setCursor(0,3);
  lcd.print("Hum: ");
  lcd.print(tab2[2]);
  lcd.print("% P: ");
  lcd.print(pression);
  lcd.print(" hPa");
  delay(10000);
  
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print("Exterieur");
  lcd.setCursor(0,1);
  lcd.print("T: ");
  lcd.print(tab2[5]);
  lcd.print(char(223));
  lcd.print("C  Hum: ");
  lcd.print(tab2[6]);
  lcd.print("%");
  lcd.setCursor(0,2);
  lcd.print("Pluie : ");
  lcd.print(preci_h);
  lcd.print(" mm/h");
  lcd.setCursor(8,3);
  lcd.print(preci_j);
  lcd.print(" mm/j");
  delay(10000);
}
}

  Serial.println();
  Serial.println("closing connection");
}