Envoie message vers Jeedom

Bonjour,

Je souhaiterai en plus d'envoyer vers ma BD les informations de ma station meteo les envoyer également vers mon jeedom, j'ai bien un retour 200 signifiant que cela fonction pourtant la variable ne se met pas à jour

Déclaration de variable:

/ Network credentials Jeedom
const char* jeedomURL = "http://192.168.0.22:80/core/api/jeeApi.php?apikey=HMwW57LI/////qeHUQL&type=cmd&id=4786&value=";

J'ai cette fonction :

void messagehhtpJeedom(int valeurJeedom){
    HTTPClient http;
    http.begin(jeedomURL);
    http.addHeader("Content-Type", "application/x-www-form-urlencoded");
    httppushjeedom = valeurJeedom;
    int httpResponseCodeJ = http.POST(httppushjeedom);
    Serial.print("URL POST: ");  Serial.print(httppushjeedom);Serial.print("// HTTP Jeedom Response code:  ");  Serial.println(httpResponseCodeJ);
    http.end();
    delay(5000);
}

En affichage sur le moniteur j'ai bien :
URL POST: 200// HTTP Jeedom Response code: 200

J'ai essayé de concatener l'URL et la valeur 200 , ma variable se met bien à jour

http://192.168.0.22:80/core/api/jeeApi.php?apikey=HMwW57LI/////qeHUQL&type=cmd&id=4786&value=200

En parallèle j'envoie mes infos sur ma BD (site webhost) à peu prés de la même façon et sans problème.

: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

As tu curl pour essayer ton URL ?
Sinon il existe des extension pour la plus pars des navigateurs WEB.

Je n'ai pas bien compris ton URL qui semble être pour passer la valeur(value) en paramétre?
Ni non plus comment tu passe ta valeur en POST directement, alors que tu déclares que les données sont "x-www-form-urlencoded", donc plutot de la forme value=123

Bonjour Terwal,
De retour de vacances je viens de pendre
connaissance de tes questions :

En fait basiquement je concatène mon URL
const char* jeedomURL = "http://192.168.0.22:80/core/api/jeeApi.php?apikey=HMwW57LI/////qeHUQL&type=cmd&id=4786&value=" avec la valeur int valeurJeedom de ma fonction
ensuite avec l'explorateur j'envoie le message et ça fonctionne j'arrive à mettre à jour mon jeedom

Oui effectivement je veux passer une variable

Alors j'ai fait du copie collé et pour être honnête je ne comprends le sens exact de "x-www-form-urlencoded si tu peux m'en dire plus

Dans ce cas, il faut faire la même chose dans ton code. car ce n'est pas la même chose d'envoyer les paramètres dans l'URL et dans les données POST.

Dans ton code tu passe bien la valeur de la variable valeurJeedom, mais tu ne l'a récupère pas :slight_smile:, comme je l'ai indiqué dans l'explication qui suivait.
C'est le même problème que le point précédent.

Oui, je vois ça :slight_smile:
tu as deux chose form et urlencoded, form indiqué que tu as une chaine de la forme nom_paramêtre=valeur, nom_paramêtre qui peut être value, id ou type. si on fait correspondre les valeurs 15.5, 4786, cmd, cela donne value=15.5&id=4786&type=cmd

urlencoded veut dire que l'on encode la chaine en remplacent tout les caractères réservés et certains commun aussi par un équivalent avec un %, par exemple l'espace par %20.

Après bien que "x-www.form.urlencoded" peut s'appliquer à toutes chaine cela fait souvent référence à l'URI de ta requête.
Lorsque tu fais un http.addHeader("Content-Type", "application/x-www-form-urlencoded"); tu indique par exemple que le contenu de la requête utilise le format cité plus haut.
Le contenu de la requête est des données en plus de l'URI.
Ce contenu est indiqué lorsque tu utilises la méthode POST, avec la méthode GET il n'y a pas de contenu.
Donc toi tu utilise une URI "http://192.168.0.22:80/core/api/jeeApi.php?apikey=HMwW57LI/////qeHUQL&type=cmd&id=4786&value=" et un contenu qui contient la valeur de la variable valeurJeedom
Il n'y a pas de lien implicite entre cette valeur et le paramêtre mal former dans ton URI value.

Je ne sais pas si je suis très claire :frowning: , tout ça pour dire, qu'a priori toi tu veux faire une requête HTTP, avec la méthode GET et donc qu'il faut concaténer ta chaine jeedomURL avec la valeur de la variable valeurJeedom, attention si ta variable valeurJeedom contient une chaine est pas seulement un numérique, il faudrait par précaution "url encoder" celle-ci.

Merci Terwal,
Il faut que je digère tout cela mais un grand merci je vais m'y pencher pour mieux comprendre ce que j'ai bêtement copié collé.

Je ne sais pas si d'autre aurait des liens expliquant tous ça en détailles ?
peut être @J-M-L ou @pandaroux007

expliquant quoi exactement ?

tout mon charabia sur la différence entre la méthode POST et GET, ainsi que le passage de paramètre

on peut essayer de résumer le principe de base :

Un serveur HTTP répond à des requêtes. Une requête est formée d'un en-tête et d'un corps qui sont définis par le protocole HTTP. c'est du texte en ASCII (généralement)

Pour transmettre des données dans une requête, on peut structurer la requête sous deux formes principales: POST ou GET et la différence entre POST et GET réside principalement dans la manière dont les données sont transmises au serveur.

➜ Avec GET, les données sont envoyées via l'URL, dans la ligne de requête (dans l'en-tête, ce qui implique un taille limite)
➜ Avec POST les données sont envoyées dans le corps de la requête (moins de limitation de taille)

Les données envoyées peuvent arriver sur des machines différentes où être maltraitées par le réseau. Pour bien se comprendre ou éviter les problèmes, on peut encoder les données. On précisera alors dans l'en-tête de la requête comment sont encodées ces données.

x-www-form-urlencoded définit l'encodage du contenu d'une requête POST ou GET : ce sera sous la forme de paires clé-valeur, où les valeurs sont encodées de manière à être sûres pour l'envoi dans une URL. Cela signifie que les caractères spéciaux sont convertis en leur équivalent hexadécimal (%xx).

par exemple, supposons que vous vouliez envoyer un nom et prénom au serveur HTTP et que le nom contienne des caractères non ASCII comme par exemple Björk Guðmundsdóttir. Les lettres ö, ð ou ó pourraient poser problème, on va donc les encoder.

Par exemple en UTF 8, ö est codé C3B6 et donc avec l'encodage, en lieu et place du ö, on mettra %C3%B6

La requête GET envoyée à www.monsite.fr/contact contiendra le texte suivant:

GET /contact?nom=Gu%C3%B0mundsd%C3%B3ttir&prenom=Bj%C3%B6rk HTTP/1.1
Host: www.monsite.fr
Content-Type: application/x-www-form-urlencoded

alors que si on fait un POST, ça ressemblera à cela

POST /contact HTTP/1.1
Host: www.monsite.fr
Content-Type: application/x-www-form-urlencoded

nom=Gu%C3%B0mundsd%C3%B3ttir&prenom=Bj%C3%B6rk

notez la ligne vide entre l'en-tête HTTP et le corps, c'est comme cela qu'on reconnait la fin de l'en-tête

Notez aussi que l'encodage n'est généralement pas explicitement spécifié dans une requête GET. L'encodage des caractères dans l'URL suit généralement les règles de l'encodage UTF-8 par défaut, qui est largement utilisé sur le web et est le codage standard dans l'IDE Arduino.

ça aide ??

En tous cas moi, je trouve ça bien plus claire et structuré que mes explications :face_with_hand_over_mouth:

Bonjour à vous 2
J’ai pris un peu de temps pour lire et comprendre toutes vos explications bien détaillées
Un grand merci j’ai complété en cherchant des explications
Résultat : ça fonctionne j’ai corrigé mes erreurs à partir de vos explications

1 Like

Bravo!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.