Donnée Netatmo sur Arduino

Bonjour à tous,

J'aimerai récupérer les données de ma station météo Netatmo sur mon Arduino Uno pour faire un afficheur permanent sans avoir besoin de sortir le téléphone ou la tablette.

Je n'ai rien trouvé de probant sur Internet, hormis un système avec utilisation d'un synology et un script php pour récupérer les données de Netatmo avant de les récupérer sur Arduino. Un peu compliqué, d'autant plus que je n'ai pas de Synology.

Voici donc le cahier des charges :

  • Arduino Uno
  • Ecran TFT 320x200 (Adafruit)
  • Shield Ethernet (filaire car le dispositif sera à porté de cable de la box internet)
  • Afficher en permanence sur l'écran les dernière données de la station Netatmo (Temp int/ext + CO2 + Humidité + Pression + Pluie + Bruit...)
  • Je ne sais pas encore si je vais tout afficher en même temps ou si je vais afficher les infos en défilement toutes les quelques secondes...

Architecture :

La station netatmo (https://www.netatmo.com/fr-FR/produit/station-meteo) collecte les données localement et les envoi par wifi sur les serveurs Netatmo.
Une application web / mobile permet de consulter les informations collectées.
Le montage Arduino doit donc se connecter à Internet pour récupérer les données collectées.

Difficulté à surmonter (d’où l'ouverture de ce post) :

  • récupérer les données du serveur netatmo directement depuis l'arduino (via request JSON)

Résultat de mes recherches :

  1. il faut créer un compte sur l'environnement de développement Netatmo (https://dev.netatmo.com/dev/createapp)
    ==> ceci permet d'avoir tous les éléments pour l'authentification (clientID, clientSecret, login, password).

  2. l'appel au serveur Netatmo se fait par requette HTTP et le résultat est au format JSON.
    ==> https://dev.netatmo.com/doc

  3. Il existe une librairie qui permet de décoder le format JSON (GitHub - bblanchon/ArduinoJson: 📟 JSON library for Arduino and embedded C++. Simple and efficient.)

==> Maintenant, je ne suis pas à l'aise avec cette partie de la programmation (requete et interprétation des résultats) - pour la partie affichage sur le LCD/TFT, pas de soucis...

Si l'un de vous l'a déjà fait, ou dispose d'un .INO equivalent qui fait des requettes HTTP avec authentification et récupération de données JSON, alors je suis preneur.

Merci pour votre aide.

Bonsoir,

Je m'auto-réponds partiellement, j'ai pas fini de lire les docs mais c'est une activité très instructive (RTFM comme dise les américains).

  1. Il faut récupérer un token d'authentification (https://dev.netatmo.com/doc/authentication/usercred)
    ==> Fournir les 4 paramètres (login/mdp/clientId/clientSecret)

  2. Il faut demander les infos de la station
    ==> en passant en paramètre le token d'authentification (https://dev.netatmo.com/doc/methods/getstationsdata)

On peut faire ca en HTTP GET. On récupère du texte qu'il faut ensuite parser pour extraire les valeurs.

A priori, on fait un GET de la façon suivante (https://www.arduino.cc/en/Tutorial/WebClient).
Ensuite, il faut parser le texte récupéré pour en extraire le token et les valeurs de température, co2, etc...
Pour cela, il y a une librairie qui fait ca (GitHub - bblanchon/ArduinoJson: 📟 JSON library for Arduino and embedded C++. Simple and efficient.).

J'ai plus qu'a tester tout ca ce WE.

D'ici la, je suis preneur de vos retours d’expériences, et si l'un de vous l'a déjà fait, je veux bien le code Arduino qui fait le boulot, ça me fera gagner du temps car il faut que j’expérimente tous les maillons (shield Ethernet, methode GET, parsing JSON...)

A+

Bonjour,

J'ai reçu mon shield Ethernet, je peux donc commencer à tester en vrai ce que j'ai lu !

Pas de bol, dès le premier test, ca marche pas. (Le ethernet.begin (mac) ou (mac,ip) me retourne 0. donc impossible d'avoir une connection !

J'utilise ce shield : http://www.amazon.fr/gp/product/B00PQA6G8O?psc=1&redirect=true&ref_=oh_aui_detailpage_o00_s00
J'utilise le code Ethernet client du site arudino.cc : Ethernet - Arduino Reference

J'ai biensur adapté l'adresse IP à mon réseau.
Coté diagnostique, le shield semble fonctionner, le programme de test SD me permet bien de lire le contenu d'une carte SD introduite dans le shield.
Les leds ethernet s'allument bien quand je branche le cable.
Par contre, je ne vois pas la carte dans mon moniteur DHCP de ma freebox.

Un petit coup de main ?

Merci.

bonjour,
mettre une ip en fixe en dehors de la plage dhcp.
modifie ton code pour inclure

byte mac[] = {  
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 
  192,168,2,200 };
unsigned char gateway[] = { 
  192,168,2,2 };			
unsigned char mask[] = {
  255,255,255,0}; 


dans le setup
  Ethernet.begin(mac, ip, gateway, mask);

Tarasbulba:
Les leds ethernet s'allument bien quand je branche le cable.
Par contre, je ne vois pas la carte dans mon moniteur DHCP de ma freebox.
Un petit coup de main ?

est ce bien un W5100 comme sur la photo ou un 5200 ou un 5500 ???

infobarquee:
byte ip[] = {
192,168,2,200 };
unsigned char gateway[] = {
192,168,2,2 };
dans le setup
Ethernet.begin(mac, ip, gateway, mask);

à adapter en fonction de ta config par défaut un freebox est à l'adresse 192, 168, 0, 254, mais ça doit fonctionner aussi en DHCP (choix à faire en fonction tes besoins ultérieurs ...)

Merci pour vos tuyaux. Il me semble avoir essayé le ethernet.begin avec les 4 paramètres, mais je vais retenter le coup.
Il s'agit bien d'un 5100.

A suivre.

Hello,

Donc ca marche toujours pas.

Voici le sketch, basé sur le sketch exemple du site arduino.cc :

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server(74,125,232,128);  // numeric IP for Google (no DNS)
//char server[] = "www.google.com";    // name address for Google (using DNS)

IPAddress _ip(192, 168, 0, 177);
IPAddress _gway(192, 168, 0, 254);
IPAddress _dns(192, 168, 0, 254);
IPAddress _mask(255, 255, 255, 0);

EthernetClient client;

void setup() {
  Serial.begin(57600);
  
  Serial.print ("Init ethernet...");
  Ethernet.begin(mac, _ip, _dns, _gway, _mask);
  delay(1000);
  Serial.println (Ethernet.localIP());
  
  
  Serial.println("connecting...");
  int CodeRetour = client.connect(server, 80);
  Serial.print ("Code retour Ethernetclient.connect = ");
  Serial.println (CodeRetour);

  
  if (CodeRetour==1) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("GET /search?q=arduino HTTP/1.1");
    client.println("Host: www.google.com");
    client.println("Connection: close");
    client.println();
  } else {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}

void loop() {
  // if there are incoming bytes available
  // from the server, read them and print them:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    // do nothing forevermore:
    while (true);
  }
}

Voila le résultat sur la console :

Opening port
Port open
Init ethernet...192.168.0.177
connecting...
Code retour Ethernetclient.connect = 0
connection failed

disconnecting.

Ce qui est bizare, je récupère un code retour = 0 alors que dans la doc, il n'y a pas de 0...
Returns

Returns an int (1,-1,-2,-3,-4) indicating connection status :

SUCCESS 1
TIMED_OUT -1
INVALID_SERVER -2
TRUNCATED -3
INVALID_RESPONSE -4

==> Si vous avez une idée, je suis preneur.

Merci.

change

IPAddress _dns(192, 168, 0, 254);

par

IPAddress _dns(8, 8, 8, 8);

Pas mieux, ca donne le même résultat.
Avec le DNS de FREE 212.27.40.240, ca ne marche pas non plus.

Ethernetclient.connect = 0

impossible de se connecter au server, donc ca ne veut pas dire que ca ne passe pas :wink:

mets en server 216.58.208.195

Arg, non plus !
Je l'avais testé aussi !
J'ai essayé plusieurs sketch exemple et j'ai toujours un problème a ce stade.
Est ce que mon shield pourrai être défectueux ?

En farfouillant sur les references, je suis tombé sur celle la : Ethernet - Arduino Reference

En ajoutant dans le code le test, eh bien, ca coince à ce niveau.
Donc, le client Ethernet ne s'initialise pas...

==> Des idées ?

Voici le code :

#include <SPI.h>
#include <Ethernet.h>

byte _mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress _ip (192, 168, 0, 177);
IPAddress _dns (212, 27, 40, 240);
IPAddress _gway(192, 168, 0, 254);
IPAddress _mask(255, 255, 255, 0);

IPAddress _server(216, 58, 208, 195);  // numeric IP for Google (no DNS)
//char server[] = "www.google.com";    // name address for Google (using DNS)


EthernetClient client;

void setup() {
	Serial.begin(57600);
	
	Serial.print ("Init ethernet...");
	Ethernet.begin(_mac, _ip, _dns, _gway, _mask);
	delay(1000);
	Serial.println (Ethernet.localIP());
	
	
	Serial.print ("Etat du client Ethernet : ");
	while(!client){
		; // wait until there is a client connected to proceed
		Serial.print ("."); delay (1000);
	}
	
		
	Serial.println("connecting...");
	int CodeRetour = client.connect(_server, 80);
	Serial.print ("Code retour Ethernetclient.connect = ");
	Serial.println (CodeRetour);
	
	
	if (CodeRetour==1) {
		Serial.println("connected");
		// Make a HTTP request:
		client.println("GET /search?q=arduino HTTP/1.1");
		client.println("Host: www.google.com");
		client.println("Connection: close");
		client.println();
		} else {
		// if you didn't get a connection to the server:
		Serial.println("connection failed");
	}
}

void loop() {
	// if there are incoming bytes available
	// from the server, read them and print them:
	if (client.available()) {
		char c = client.read();
		Serial.print(c);
	}

	// if the server's disconnected, stop the client:
	if (!client.connected()) {
		Serial.println();
		Serial.println("disconnecting.");
		client.stop();

		// do nothing forevermore:
		while (true);
	}
}

Tarasbulba:
==> Des idées ?

tu confirmes bien que le chip de ta carte est un 5100
tu as quoi comme freebox ?
pourrais tu nous donner le résultat d'une commande "ipconfig" sur ton pc

Hello,

Oui, c'est bien un 5100 (écrit sur le chip centrale de la carte ethernet).

Freebox révolution.

Ipconfig sur le PC :

Carte Ethernet Ethernet :

Suffixe DNS propre à la connexion. . . :
Adresse IPv6 de liaison locale. . . . .: fe80::4576:2ef2:9c73:c5db%22
Adresse IPv4. . . . . . . . . . . . . .: 192.168.0.10
Masque de sous-réseau. . . . . . . . . : 255.255.255.0
Passerelle par défaut. . . . . . . . . : 192.168.0.254

Pour info, je n'arrive pas à pinguer mon shield ethernet depuis mon PC, même lorsque le client.IPlocal retourne une adresse IP.

dans ton interface "http://mafreebox.freebox.fr" ... parametres de la freebox ...switch
est ce que tu vois ton arduino actif avec sa mac adresse ?

Non, pas vu, ni dans la partie DHCP.

si tu as mis uniquement ton UNO + schield Ethernet alimentés en USB + exemple Ethenet Webserveur (IP adaptée) et que ta box ne le détecte pas il faut vérifier visuellement ton schield pour détecter éventuellement une mauvaise soudure ou une goute de soudure qui fait court circuit entre deux pistes (je l'ai eu sur le connecteur ICSP)
si rien de visible ... j'ai bien peur qu'il n'y a plus rien a attendre de ton module

C'est bien ce que je commence à penser aussi.
Pourtant, il semble fonctionner car la partie lecteur SD fonctionne OK, les led clignotent quand je branche le cable RJ45, le PCB est propre...
Je vais tenter de faire jouer la garantie et m'en acheter un autre ! ==> tu te fourni ou pour tes shields (et merci d'avoir passé du temps à essayer de trouver le pb avec moi).

j'achète directement en RPC (AliEx...ss ou Bang...ood)

ok, donc tu es patient quand aux délais de livraison... sur ce coup, j'ai pas trop envie d'attendre. J'ai trouvé un vendeur en france sur ebay pas trop cher.
A suivre. Je reprends le post dès que j'ai un shield ethernet qui marche.
Je compte bien faire mon moniteur Netatmo au final...