Problème envoi des données sur le site Awekas

Bonjour,
J'ai construit ma station météo à base de Wemos D1 mini, et je transmets les données sur les sites Wunderground et Weathercloud sans problème.
Maintenant je voudrais faire l'envoi vers le site Awekas.at mais je n'y arrive pas, en cherchant sur internet certains tutos disaient de s'inspirer de l'envoi vers Wunderground , ce que j'ai fait mais cela ne fonctionne pas.
voici le code de la fonction :

void sendDataToAweKas() {

  if (wifiClient.connect(AweKasServer, 80)) {
    wifiClient.print(AweKasWebPage);
    wifiClient.print("ID=");
    wifiClient.print(AweKasID);
    wifiClient.print("&PASSWORD=");
    wifiClient.print(AweKasKey);
    wifiClient.print("&dateutc=now");
    wifiClient.print("&tempf=");
    wifiClient.print((temperature * 9 / 5) + 32);
    wifiClient.print("&dewptf=");
    wifiClient.print(((dew / 10) * 9 / 5) + 32);
    wifiClient.print("&winddir=");
    wifiClient.print(angw);
    wifiClient.print("&windspeedmph=");
    wifiClient.print(vitesseVent * 0.621371);
    wifiClient.print("&windgustmph=");
    wifiClient.print(vitesseRafale * 0.621371);
    Serial.print("vitesseRafale envoyée depuis WU:");
    Serial.println(vitesseRafale);
    wifiClient.print("&rainin=");
    wifiClient.print(pluieHeure / 25.4);     // attention a mettre en pouces (inches) !
    wifiClient.print("&dailyrainin=");
    wifiClient.print(pluieJour / 25.4);     // attention a mettre en pouces (inches) !
    //wifiClient.print("&UV=");
    //wifiClient.print(Uvi);
    //wifiClient.print("&solarradiation=");
    //wifiClient.print(Uvj);
    wifiClient.print("&humidity=");
    wifiClient.print(humidity);
    wifiClient.print("&baromin=");
    wifiClient.print(pressure / 33.863);
    wifiClient.print("&softwaretype=DS3231_02102024&action=updateraw&realtime=1&rtfreq=30");
    wifiClient.print("/ HTTP/1.1\r\nHost: rtupdate.ws.awekas.at:80\r\nConnection: close\r\n\r\n");
   
    wifiClient.stop();
    delay(1000);
    Serial.println("Envoi des donnees sur Awekas effectue. ");
  } else {
    Serial.println("Erreur connection Awekas");
  }
  
} 

avec ceci comme identifiants:
// Awekas

#define AweKasServer "ws.awekas.at"
#define AweKasWebPage "GET /weatherstation/updateweatherstation.php?"
#define AweKasID "xxxxx" // station essai
#define AweKasKey "xxxxx" // station essai

pouvez vous m'aider, merci d'avance

:warning:
Post mis dans la mauvaise section, on parle anglais dans les forums généraux. déplacé vers le forum francophone.

Merci de prendre en compte les recommandations listées dans Les bonnes pratiques du Forum Francophone

@UKHeliBob Désolé merci pour votre initiative. Cdlt

Vous avez la doc technique pour les APIs de ce site?

Ce n'est pas très sérieux comme réponse.
Je suppose qu'Awekas doit avoir publié une doc de leur API pour indiquer aux utilisateurs comment transférer leurs données.

Oui j'ai trouvé ceci concernant l'api d'awekas :
api awekas
mais d'après ce que j'ai compris, c'est plutôt fait pour récupérer des données que d'en envoyer, mais je comprends pas tout :face_with_raised_eyebrow:
et pour l'aide sur leur site, j'ai rien trouvé d'intéressant car c'est plutôt prévu pour des stations météo du commerce avec déjà dans le software ce qu'il faut pour les envois...
Je dois préciser que j'avais déjà réussi à envoyer mes données en 08/2024, mais suite à
un petit problème d'ordi j'ai perdu certains de mes sketchs, et notamment celui ou j'avais intégré l'envoi vers ce site awekas !
ma station sur awekas

c'est pour la consultation, pas l'export.

En simulant la création d'un compte chez eux, je vois cela si je choisis une station du commerce


et donc il n'y a rien à paramétrer dans son compte, ça se fait sur la station qui connait le protocole d'émission

Mais si je dis que c'est une autre station inconnue avec comme transfert de données un truc qui ne ressemble pas à un produit du commerce

Ils me proposent de donner une URL qui va permettre à leur site d'interroger ma station pour obtenir des données. Je suppose que le format attendu doit être particulier.

➜ Si mon interprétation est correcte, ce n'est pas votre station qui envoie ("push") les données directement dans leur API mais leur site qui vient récupérer ("pull") les données de temps en temps.

@J-M-L votre interprétation est la bonne.
Moi je dois faire l'envoi comme si j'avais une station du commerce et simuler l'envoi comme je l'avais déjà fait au mois d'Aout en m'inspirant du protocole wunderground comme décrit ici en post #4 :
https://www.awekas.at/for2/index.php?thread/18586-froggit-wh3000/

j'essaye de reproduire ce que j'avais fait mais les données n'arrivent pas !

Je n’ai rien trouvé qui disait que les stations du commerce fonctionnaient différemment et faisaient du push. Je n’ai pas vu d’API publique pour cela.

L’avantage pour eux de faire du pull c’est qu’ils maîtrisent les flux et s’exposent moins aux attaques

@J-M-L D'accord mais j'avais bien réussi à envoyer mes données au mois d’Août, je ne comprends pas ce que je fais faux en fait... ?

Ils expliquent en effet de faire un envoi vers le serveur personnalisé en suivant ces instructions :

  • activez le mode serveur personnalisé
  • utilisez le protocole Wunderground
  • entrez comme serveur : ws.awekas.at
  • utilisez comme chemin : /weatherstation/updateweatherstation.php?
  • comme utilisateur : votre nom d'utilisateur Awekas
  • comme mot de passe, vous devez entrer le mot de passe Awekas
  • entrez 80 comme port
  • et définissez un intervalle raisonnable - environ 300

c'était en 2023, êtes vous sûr qu'ils ont conservé cette API?

Un moyen de tester depuis la ligne de commande serait d'essayer d'envoyer la température (en Fahrenheit) et l'humidité par exemple

curl -X POST "http://ws.awekas.at/weatherstation/updateweatherstation.php?" \
     -d "ID=VOTRE_ID&password=VOTRE_MOT_DE_PASSE&tempf=77&humidity=60"

si cela fonctionne alors on devrait pouvoir faire la même chose depuis un arduino

@J-M-L merci pour cette excellente idée, après plusieurs essais et petites modifications dans le libellé de la requête, les données sont bien arrivées !
J'ai utilisé cette synthaxe pour y parvenir sans HTTP et sans le -d :

philippe@InWinZorinOs:~$ curl -X POST "ws.awekas.at/weatherstation/updateweatherstation.php?""ID=xxxxxx&password=xxxxxx&tempf=77&humidity=60"
OKphilippe@InWinZorinOs:~$ 

et sur la page Awekas de ma station :
ma station

avec la date d'aujourd'hui, donc c'est faisable :wink:

et controle de l'envoi des données sur leur site :
Controle envoi des données

OK donc c'est un simple envoi en HTTP sur le port 80 qu'il faut faire

essayez un truc comme cela (toujours câblé en dur pour le moment)

#include <ESP8266WiFi.h>
#include <WiFiClient.h>

const char* ssid = "votre_SSID";
const char* password = "votre_MDP";
const char* host = "ws.awekas.at";
const char* url = "/weatherstation/updateweatherstation.php?ID=xxxxxx&password=xxxxxx&tempf=77&humidity=60";

void envoyer() {
  WiFiClient client;
  if (client.connect(host, 80)) {
    client.print("POST ");
    client.print(url);
    client.print(" HTTP/1.1\r\n");
    client.print("Host: ");
    client.print(host);
    client.print("\r\n");
    client.print("Connection: close\r\n\r\n");

    Serial.println("Données envoyées !");

    while (client.connected() || client.available()) {
      if (client.available()) {
        char line[128]; // Buffer pour lire la réponse
        client.readBytesUntil('\n', line, sizeof(line));
        Serial.println(line);
      }
    }
  } else {
    Serial.println("Échec de la connexion");
  }
}

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connexion au WiFi...");
  }

  Serial.println("Connecté au WiFi");
  envoyer();
}

void loop() {}

(tapé ici donc il peut y avoir des erreurs)

Test effectué de votre mini sketch avec succès, voici ce que le moniteur série indique :

13:28:22.730 -> Connecté au WiFi
13:28:22.763 -> Données envoyées !
13:28:22.863 -> HTTP/1.1 200 OK
Livebox-06A8
13:28:22.863 -> content-type: text/html; charset=ISO-8859-1

13:28:22.863 -> vary: Accept-Encoding
l; charset=ISO-8859-1

13:28:22.863 -> x-turbo-charged-by: LiteSpeed
et=ISO-8859-1

13:28:22.863 -> content-length: 2
: LiteSpeed
et=ISO-8859-1

13:28:22.863 -> date: Sat, 05 Oct 2024 11:28:23 GMT
-8859-1

13:28:22.896 -> server: LiteSpeed
2024 11:28:23 GMT
-8859-1

13:28:22.896 -> connection: close
2024 11:28:23 GMT
-8859-1

13:28:22.896 -> 
onnection: close
2024 11:28:23 GMT
-8859-1

13:28:27.875 -> OKnnection: close
2024 11:28:23 GMT
-8859-1


Voilà ma page station est bien modifiée avec les nouvelles valeurs.

OK donc la transmission s'effectue correctement et est prise en compte côté serveur.

il ne reste plus qu'à rendre dynamique la partie statique &tempf=77&humidity=60

un truc du genre (tapé aussi ici donc attention aux bugs) pour émettre toutes les 15 minutes (intervalEnvoi)

Il y a deux fonctions "bidons" (lireTemperatureF et lireHumidite) qui génèrent une valeur aléatoire. Il faudra bien sûr mettre à la place la lecture des capteurs.

L'URL est bâtie dynamiquement avec les client.print("&xxx="); client.print(xxx); pour ajouter les champs souhaités qui correspondent à la spec du protocole Wunderground.

#include <ESP8266WiFi.h>
#include <WiFiClient.h>

const char* ssid = "votre_SSID";
const char* passwordWifi = "votre_MDP";
const char* host = "ws.awekas.at";
const char* idStation = "votre_ID";      // ID de la station météo
const char* mdpStation = "votre_mdp";    // Mot de passe de la station météo

const unsigned long intervalEnvoi = 1000ul * 60ul * 15ul; // Intervalle de 15 minutes en millisecondes
unsigned long dernierEnvoi = 0;

float lireTemperatureF() {
  float tempC = random(-40, 46); // Génère une température en °C entre -40 et 45
  return tempC * 9.0 / 5.0 + 32.0; // Convertir en °F
}

int lireHumidite() {
  return random(0, 101); // Génère un pourcentage d'humidité entre 0 et 100
}

void envoyer() {
  WiFiClient client;

  float temperatureF = lireTemperatureF(); // Lire la température
  int humidite = lireHumidite(); // Lire l'humidité

  if (client.connect(host, 80)) {
    client.print("POST /weatherstation/updateweatherstation.php?ID=");
    client.print(idStation);    
    client.print("&password=");    client.print(mdpStation);   
    client.print("&tempf=");       client.print(temperatureF, 2); // Affichage de la température avec deux décimales
    client.print("&humidity=");    client.print(humidite);
    client.print(" HTTP/1.1\r\n");

    client.print("Host: ");       client.print(host);
    client.print("\r\n");
    client.print("Connection: close\r\n\r\n");
    Serial.println("Données envoyées !");

    while (client.connected() || client.available()) {
      if (client.available()) {
        char line[128]; // Buffer pour lire la réponse
        client.readBytesUntil('\n', line, sizeof(line));
        Serial.println(line);
      }
    }
  } else {
    Serial.println("Échec de la connexion");
  }
}

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, passwordWifi);

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connexion au WiFi...");
  }

  Serial.println("Connecté au WiFi");
}

void loop() {
  unsigned long maintenant = millis();

  if (maintenant - dernierEnvoi >= intervalEnvoi) {
    envoyer();
    dernierEnvoi = maintenant;
  }
}

@J-M-L aucun bug dans votre sketch :wave:
je le laisse tourner ce soir, j'ai mis des envois toutes les 5 minutes pour tester,
demain j'essayerai de rajouter d'autres valeurs comme celles du vent par exemple,
merci déjà pour votre aide .

En lisant votre sujet, je me suis trouvé encouragé à m'inscrire sur WeatherCloud. Où y avez-vous trouvé les instructions de transfert de données ?
Puis-je me fier à ce que vous présentez ci-haut pour AweKasServer ?
Merci.

@Patriboom Tant mieux si mon sujet vous a encouragé à vous inscrire sur Weathercloud, voici la fonction que j'appelle pour l'envoi des données sur ce site .

void sentDataToWeatherCloud() {

  if (wifiClient.connect(WeatherCloudServer, 80)) {
    wifiClient.print("GET /v01/set");
    wifiClient.print("/wid/"); wifiClient.print(WeatherCloudID);
    wifiClient.print("/key/"); wifiClient.print(WeatherCloudKey);
    wifiClient.print("/softwareid/"); wifiClient.print("d50a5c965d45");
    wifiClient.print("/temp/"); wifiClient.print(temperature * 10);
    wifiClient.print("/hum/"); wifiClient.print(humidity);
    wifiClient.print("/bar/"); wifiClient.print(pressure * 10);
    wifiClient.print("/dew/"); wifiClient.print(dew);
    wifiClient.print("/heat/"); wifiClient.print(heat);
    
    wifiClient.print("/battery/"); wifiClient.print(Voltage * 10);
    wifiClient.print("/rain/"); wifiClient.print(pluieJour * 10); // quantite de pluie dans une journee
    wifiClient.print("/rainrate/"); wifiClient.print(pluieHeure * 10); // quantite de pluie dans une heure
    wifiClient.print("/chill/"); wifiClient.print(windChill * 10);
    wifiClient.print("/wspd/"); wifiClient.print(metersPerSecond(vitesseVent) * 10);
    wifiClient.print("/wdir/"); wifiClient.print(angw);
    wifiClient.print("/wspdhi/"); wifiClient.print(metersPerSecond(vitesseRafale) * 10);
    //wifiClient.print("/uvi/"); wifiClient.print(Uvi * 10);        // index uv x10 [0,160] 8.0->80
    //wifiClient.print("/solarrad/"); wifiClient.print(Uvj * 10);  // watts/m2 x10 [0,20000] 1050.0->10500
    wifiClient.println("/ HTTP/1.1");
    wifiClient.println("Host: 188.164.196.110");
    wifiClient.println("Connection: close");
    wifiClient.println();
    Serial.println("Donnees envoyees vers Weathercloud avec succes.\n");
    wifiClient.stop();
    //delay(100);   
        
  } 
  else {
    Serial.println("Erreur connection à Weathercloud");
  }
  
  digitalWrite(LED_BUILTIN, HIGH); // Turn the LED off
}


float metersPerSecond(float kilometersPerHour) {
  return round((kilometersPerHour * 1000 / 3600) * 10) / 10; // arrondi a 1 decimale
}

avec comme identifiants et serveur :

// Weathercloud
#define WeatherCloudServer "188.164.196.110" 
#define WeatherCloudID "xxxxxx"  
#define WeatherCloudKey "xxxxxx"  

si cela peut vous aider :wink:

Oh que oui!

Une question sur le code ... À quoi sert ceci ?

    wifiClient.print  ("/softwareid/");	wifiClient.print  ("d50a5c965d45");

Une autre question ...
Y a-t-il possibilité d'envoyer une photo en même temps que les données ?
Si vous ignorez la réponse, sauriez-vous où je pourrai trouver cette réponse ?

Merci!