ARDUINO ===> FIBARO HC2 (API HTTP JSON)

Bonjour à Tous, :wink:

Sur Arduino, je mesure la vitesse du vent avec un anémomètre output signal “pulse” vitesse appelée “vitesseVent” dans le code ci dessous.
je cherche à envoyer cette vitesse dans une variable globale appelé “testvent” dans la HC2 FIBARO

j’ai vu des sujets, sur comment envoyer l’état d’un PIN en http par API,
idem, dans le code ci dessous, on envoie une valeur “0” donc prédéfinie dans la variable “testvent” de Fibaro,
mais ce n’est pas ce que je cherche.
je voudrai remplacer le 0 de cette ligne, par la valeur contenue dans ma “vitesseVent”

String PostData = "{\r\n\"value\":\"0\"\r\n}"; //JSON data to send

je suis un grand débutant, je pense même que le code ci après (qui ne m’affiche pas d’erreur) est mal structuré entre le loop et le setup…

pourriez vous m’aider
par avance merci
voici le code complet:

#define ANEMOMETRE  1   //pin D3, interruption n°1
volatile unsigned int countAnemometre = 0;  
unsigned long previousMillis=   0;
unsigned long previousMillis2=  0;
unsigned long delaiAnemometre = 3000L;    //3 secondes
unsigned long delaiProgramme =  60000L;   //60 sec
float gust(0);        //vent max cumulé sur 1 min
float wind(0);        //vent moyen cumulé sur 1 min
int nbAnemo = 0;      //nb d'occurence de mesure Anemo
float vitesseVent(0); //vent moyen cumulé sur 1 min
#include <Ethernet.h>
#include <SPI.h>
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0E, 0xA5, 0x7E }; //physical mac address 90:A2:DA:0E:A5:7E
byte ip[] = { 192, 168, 1, 175 }; // ip in lan
byte gateway[] = { 192, 168, 1, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask   
IPAddress server(192,168,1,24); //HC2 FIBARO
EthernetClient client;

void setup() {
  Ethernet.begin(mac, ip);
  Serial.begin(9600);
  delay(1000);
  attachInterrupt(ANEMOMETRE,interruptAnemometre,RISING) ;
pinMode(3, INPUT);
 
}
/*  *  Fonction d'interruption de l'anémomètre qui incrémente un compteur à chaque impulsion */
void interruptAnemometre(){
  countAnemometre++;
}
void loop(){    
int BP = digitalRead(3); // Lecture du capteur
  unsigned long currentMillis = millis(); // read time passed
//Récupération des infos de l'anémomètre toutes les 3 sec
  //Enregistrement cumulé des valeurs
  if (currentMillis - previousMillis > delaiAnemometre){
    previousMillis = millis();
   // vitesseVent = (PI * RAYON * 2 * countAnemometre)/3*3.6; //3 = durée de prise de mesure (3sec)
    vitesseVent = (0.83 * countAnemometre)/3*3.6; //3 = durée de prise de mesure (3sec) 
    if(vitesseVent>gust) gust = vitesseVent;
    wind += vitesseVent;
    nbAnemo++;
    countAnemometre = 0;
    Serial.print("Vent:");
    Serial.println(vitesseVent); 
  }
  //Toutes les minutes, compilation des valeurs et envoi au serveur  
  if (currentMillis - previousMillis2 > delaiProgramme){
    previousMillis2 = millis();
    float avgwind = wind / nbAnemo;
    Serial.print("Wind AVG : ");
    Serial.println(avgwind);
    Serial.print("Gust : ");
    Serial.println(gust);
    
    //RAZ des compteurs qui ont servi a calculé les valeurs moyennes sur 1 min
    wind = 0;
    gust = 0;
    nbAnemo = 0;
  }
   if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  delay(1000);
Serial.println("connecting...");

String PostData = "{\r\n\"value\":\"0\"\r\n}"; //JSON data to send

 if (client.connect(server,80)) {
    Serial.println("connected");
    client.print("PUT /api/globalVariables/testvent"); //Fibaro Global Variable
    client.println(" HTTP/1.1");
    client.println("Host: 192.168.1.24");
    client.println("Authorization: Basic xxxxxxxxxxxxxx");   //need to insert base 64 user:password
    client.print("Content-Length: ");
    client.println(PostData.length());
    client.println();
    client.println(PostData); 
  }
      
  else {
   Serial.println("Connection Failed."); 
  }

  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    for(;;)
      ;
  }
}

chapeau @lesept :sunglasses: :sunglasses: :sunglasses: :sunglasses: :smiley: ;D :smiley: ;D :grinning: :grin:

top merci lesept !!
la réponse:

String PostData = "{\r\n\"value\":\"" + String(vitVent) + "\"\r\n}"; //JSON data to send

encore merci à @lesept
voici le code pour certain comme moi, qui ont cherché des fragments de codes à droite à gauche pendant… longtps!!!
le voici complet
avec un anémomètre sortie “pulse” branché sur le pin 3, 2 fils sur GND et + 5V
je cherchais à envoyer les informations vitesse du vent en temps réel (ttes les 3 sec) puis la moyenne des vitesses relevées sur 1 minute et la rafale la plus élevée sur cette même minute
le tout sur un virtuel device de la box Fibaro HC2 (en renseignant toutes les 3 secondes 3 variables)
Merci lesept, chapeau, franchement balaise

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

#define ANEMOMETRE  1   //pin D3, interruption n°1
volatile unsigned int countAnemometre = 0;
unsigned long previousMillis =   0;
unsigned long previousMillis2 =  0;
unsigned long delaiAnemometre = 3000L;    //3 secondes
unsigned long delaiProgramme =  60000L;   //60 sec
float gust(0);        //vent max cumulé sur 1 min   / variable fibaro ventMax
float wind(0);        //vent moyen cumulé sur 1 min / variable fibaro ventMoyen
int nbAnemo = 0;      //nb d'occurence de mesure Anemo
float vitesseVent(0); //vent actuel

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0E, 0xA5, 0x7E }; //physical mac address 90:A2:DA:0E:A5:7E
byte ip[] = { 192, 168, 1, 175 }; // ip in lan
byte gateway[] = { 192, 168, 1, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
IPAddress server(192, 168, 1, 24); //HC2 FIBARO
EthernetClient client;

void setup() {
  Ethernet.begin(mac, ip);
  Serial.begin(9600);
  delay(3000);
  attachInterrupt(ANEMOMETRE, interruptAnemometre, RISING) ;
  pinMode(3, INPUT);
}
/*  *  Fonction d'interruption de l'anémomètre qui incrémente un compteur à chaque impulsion */
void interruptAnemometre() {
  countAnemometre++;
}

void lectureAnemometre () {
  //Récupération des infos de l'anémomètre toutes les 3 sec
  //Enregistrement cumulé des valeurs
  if (millis() - previousMillis > delaiAnemometre) {
    previousMillis = millis();
    // vitesseVent = (PI * RAYON * 2 * countAnemometre)/3*3.6; //3 = durée de prise de mesure (3sec)
    vitesseVent = (0.83 * countAnemometre) / 3 * 3.6; //3 = durée de prise de mesure (3sec)
    if (vitesseVent > gust) gust = vitesseVent;
    wind += vitesseVent;
    nbAnemo++;
    countAnemometre = 0;
    Serial.print("Vent:");
    Serial.println(vitesseVent);

    String PostData = "{\r\n\"value\":\"" + String(vitesseVent) + "\"\r\n}"; //JSON data to send
    if (client.connect(server, 80)) {
      Serial.println("connected");
      client.print("PUT /api/globalVariables/vitesseVent"); //Fibaro Global Variable
      client.println(" HTTP/1.1");
      client.println("Host: 192.168.1.24");
      client.println("Authorization: Basic xxxxxxxxxxxx");   //need to insert base 64 user:password
      client.print("Content-Length: ");
      client.println(PostData.length());
      client.println();
      client.println(PostData);
      Serial.println();
      Serial.println("disconnecting.");
      delay(500); // par précaution, pour laisser le temps au client de recevoir tout
      client.stop();
    }
    else Serial.println("Connection Failed.");
  }
}

void compilAnemometre () {
  //Toutes les minutes, compilation des valeurs et envoi au serveur
  if (millis() - previousMillis2 > delaiProgramme) {
    previousMillis2 = millis();
    float avgwind = wind / nbAnemo;
    Serial.print("Wind AVG : ");
    Serial.println(avgwind);
    Serial.print("Gust : ");
    Serial.println(gust);
    String PostData = "{\r\n\"value\":\"" + String(avgwind) + "\"\r\n}"; //JSON data to send

    if (client.connect(server, 80)) {
      Serial.println("connected");
      client.print("PUT /api/globalVariables/ventMoyen"); //Fibaro Global Variable
      client.println(" HTTP/1.1");
      client.println("Host: 192.168.1.24");
      client.println("Authorization: Basic xxxxxxxxxxxxxxxxxx");   //need to insert base 64 user:password
      client.print("Content-Length: ");
      client.println(PostData.length());
      client.println();
      client.println(PostData);

      PostData = "{\r\n\"value\":\"" + String(gust) + "\"\r\n}"; //JSON data to send
      client.print("PUT /api/globalVariables/ventMax"); //Fibaro Global Variable
      client.println(" HTTP/1.1");
      client.println("Host: 192.168.1.24");
      client.println("Authorization: Basic xxxxxxxxxxxx");   //need to insert base 64 user:password
      client.print("Content-Length: ");
      client.println(PostData.length());
      client.println();
      client.println(PostData);
      Serial.println();
      Serial.println("disconnecting.");
      delay(500); // par précaution, pour laisser le temps au client de recevoir tout
      client.stop();
    }
    else Serial.println("Connection Failed.");

    //RAZ des compteurs qui ont servi a calculé les valeurs moyennes sur 1 min
    wind = 0;
    gust = 0;
    nbAnemo = 0;
  }
}

void loop() {
  // int BP = digitalRead(3); // Ne sert à rien dans ce code
  lectureAnemometre (); // lecture anémomètre toutes les 3 secondes
  compilAnemometre ();  // moyennage et envoi au bout d'une minute
}

reste à installer l'anemometre :slight_smile: