JSON depuis NodemcuV1.0 en language C (IDE Arduino)

Forum dédié aux bricolages d'objets connectés IOT et leurs communications avec DomoticZ :
- Remplacement de firmware des prises, modules relais ...
- Fabrication à base d'ESP8266, de NodeMCU, de Weemos et consorts ...
damien7400
Messages : 10
Inscription : 19 févr. 2017, 18:47

JSON depuis NodemcuV1.0 en language C (IDE Arduino)

Message par damien7400 »

Bonjour à tous,

j'ai développé depuis plus d'un an mon Domoticz (sur PC au départ) pour piloter mes chauffages (ELV MAX!), ma station météo (WS2300) et tous les capteurs/relais de l'appartement et de la cave (ESP8266 avec EasyEsp). Le tout tourne sur la Raspeberry 3 depuis Février.

Aujourd'hui je fabrique une télécommande murale WIFI avec base/chargeur, il s'agit d'une Nodemcuv1.0 avec un affichage st7735 1.8" et deux boutons poussoirs (j'attends les encodeurs). Une batterie d'hélico RC 3.7V 500mAh + module charge li-ion usb + module step-up 5V pour une autonomie de 24-30h.
mini nodemcu.JPG
mini nodemcu.JPG (84.07 Kio) Consulté 3485 fois
20171105_113054.jpg
20171105_113054.jpg (277.41 Kio) Consulté 3485 fois
J'ai bataillé pour trouver comment envoyer les requete ELV MAX!, sur la raspberry en Bash ou LUA je passais par NetCat:

Code : Tout sélectionner

os.execute('sudo echo s:AARAAAAAFqaCAiI= | netcat -C 192.168.2.xxx xxxxx &') 
sur la Nodemcu:

Code : Tout sélectionner

void sendReq(int o)
{
  WiFiClient client;

  client.connect("192.168.2.xxx", xxxxx);
  delay(2000);
  if (o == 1)
  {
    client.print("s:AARAAAAAFqaDAcA=\r\n");     /// Bosst Salon    
  }
  //// etc etc
    delay(500);
  client.stop();
}
  
La galère est venue du fait quil faut ajouter "/r/n" en fin de commande en C...... :evil:

Maintenant, je voudrais envoyer non plus en direct au Cube ELV MAX!, mais passer par Domoticz afin d'avoir mes "Switchs" ECO/BOOST etc mis à jour pour permettrent aux scripts de continuer à gerer les chauffages dans le temps.

La même commande (même chauffage) en JSON via un navigateur:

Code : Tout sélectionner

http://192.168.2.xxx:xxxx/json.htm?type=command&param=switchlight&idx=1&switchcmd=On
qui fonctionne parfaitement,

mais en C, avec les classes HTTPClient ou ESP8266, je n'arrive à rien, dans le log je ne reçoit m^me pas la connexion de la NOdemcu, pas d'authentification (réseau local), pas de sécurité sur les switchs.....

mon dernier essai avec une détection de la Nodemcu dans le log de domoticz mais sans action sur le switch:

Code : Tout sélectionner

  HTTPClient http;
  if (o == 1)
  {
    http.begin("http://192.168.2.xxx:xxxx/json.htm?type=command&param=switchlight&idx=1&switchcmd=On");    // Boost Salon
  }
  if (o == 2)
  {
    http.begin("http://192.168.2.xxx:xxxx/json.htm?type=command&param=switchlight&idx=4&switchcmd=Toggle");   // ECO Salle de bain
  }
  if (o == 3)
  {
    http.begin("http://192.168.2.xxx:xxxx/json.htm?type=command&param=switchlight&idx=2&switchcmd=On");    // Boost Salle de bain
  }
  if (o == 4)
  {
    http.begin("http://192.168.2.xxx:xxxx/json.htm?type=command&param=switchlight&idx=3&switchcmd=Toggle");   // ECO Salon
  }
  http.end();
j'ai essayyé cette version avec /r/n en fin de commande, j'ai tenté aussi en passant directement par le client.print... sans résultat.

Je pense que ce n'est qu'un problème de syntaxe, peut etre a cause des ? ou & présents dans les String, j'ai l'habitude du C# mais pas trop du C sous Arduino IDE.
Auriez vous une idée ?????
damien7400
Messages : 10
Inscription : 19 févr. 2017, 18:47

Re: JSON depuis NodemcuV1.0 en language C (IDE Arduino)

Message par damien7400 »

Désolé et merci beaucoup :))

pour une fois que je passe sur le forum je vous pose un spam:
la réponse était donnée par Vinz973 pour son wattmètre:

Code : Tout sélectionner

void EnvoieDomoticz(String IDX, String Svalue) {
  WiFiClient domoticz_client;
  domoticz_client.connect(domoticz_server, 4620);
  delay(500);

  int Resultat=0 ;
  int NbTentEnvoie=0;
 
  String deel1 = "GET /json.htm?type=command&param=switchlight&idx="+IDX+"&switchcmd=";
  String deel3 = " HTTP/1.1\r\nHost: www.local.lan\r\nConnection: keep-alive\r\nAccept: */*\r\n\r\n"; 
  String dataInput = String(deel1 + Svalue + deel3);
  while (Resultat!=1) {
    if (NbTentEnvoie<10){
      NbTentEnvoie++ ;
      domoticz_client.println(dataInput);
      delay(500);
      // Si le serveur repond lire toute les lignes
      while(domoticz_client.available()){
        String line = domoticz_client.readStringUntil('\r');
        if (line.lastIndexOf("status")>0 and line.lastIndexOf("OK")>0){
          Resultat = 1 ;
        }
      }
    }
  else{
      //ESP.deepSleep(2 * 1000000, WAKE_RF_DEFAULT);
    } 
   
  } 
  // deconexion
  domoticz_client.println("Connection: close");
  domoticz_client.println(); 
}
mais bon..... faut avouer que ça fait quand m^me un paquet de lignes de code pour pas grand chose :)
Tout fonctionne, merci Vinz !!
Répondre