Web server et js

Bonjour, bon Ca ne concerne pas complément la arduino mais comme je sais que vous êtes réactif j'en profite !
En gros jaffiche par exemple avec un Shields ethernet la température sur ma page web, et j'aimerais, partir de Java script, pouvoir aller soutirer cette information qui est entre deux balises et pouvoir l'utiliser comme variable dans mon script Java. Est ce que vous auriez une d'idée svp ? Merci !

Je ne comprends pas bien...

La page web est construite par l'Arduino, non? donc l'Arduino pourrait aussi générer Le Javascript avec la valeur codée directement aussi dedans et toutes les possibilités intermédiaires.

Ou voulez vous dire que vous avez cela qui existe et vous voulez faire un script qui va déclencher une requête http et interpréter le résultat pour extraire la valeur? (Chercher XMLHttpRequest)

EN faite mon projet est d'utiliser un assistant domotique, Sarah, qui a partir de mon voix, allume un relais de La arduino. Sarah fonctionne avec un plugin composé de js et de xml. EN gros quand il reconnaît ce que je lui dis, il va ouvrir une page web bien précise qui faire comme ci j'appuie sur le bouton de ma page web pour allumer la lampe ( ex :74.473.383.384.:9865/?button1on). Sur cette page web donc il y a les boutons pour l'allumage des led mais j'y affiche aussi l'état des pins. Ce que j'aimerais cest que a partir de Sarah (de mon pc ), jarrive avec mon js à aller chercher l'état des pins pour les mettres sous forme de variable puis ensuite que Sarah l'énonce à haute voix. J'espère avoir bien explique. Merci de votre aide

Faut lire la doc... (Comment récupérer une partie d'une page Web)

Mais si c'est vous qui maîtrisez le code Arduino, faut plutôt échanger en XML et parser le XML

JE n'ai pas bien compris échanger EN xml ou parser le xml. Jai juste besoin de récupère la donnée de une seule balise. Il faudrait donc signale l'adresse URL de la page ainsi que les balises. Ensuite inclure cette fonction de mon fichier js deja fonctionnelle mais avec une option EN plus.

Dans ce doc il ne précise pas d'url, il y en a une dans le phantom mais je ne connais pas ... JE ne sais pas à Quoi ca correspond

Bonjour,

La première chose à faire, c'est d'expliquer quel matériel tu utilises: Arduino, OK, mais quelle carte ?
La deuxième chose, c'est de nous dire comment tous les matériels communiquent ensemble: série ? Wifi ? Ethernet ? i2c ? ... ?

Cest une arduino uno avec un Shield ethernet 2

Contrôlez vous le code arduino ?

Bonjour,

tout ceci est quand même bien confus. Est-il possible d'avoir une description plus précise. Où et qui stocke la page web ? Est-ce vous ou un serveur extérieur ? La vrai question est : Avez vous "la main" sur le code de la page web ou pas ? XMLHttpRequest est sans doute la bonne solution mais attention au cross-domain. Un serveur extérieur n'acceptera pas en principe les connexions hors de son domaine.

Mais encore une fois décrivez mieux tout cela et ce sera beaucoup plus facile de vous aider.

LE code js :

exports.action = function(data, callback, config, SARAH) {
  
var exec = require('child_process').exec;

  if (data.val == "allume1"){
	var process = '%CD%/plugins/lampe/allume1.bat';
	var texte = ' la chambre est allumé';
  }
    if (data.val == "allume2"){
	var process = '%CD%/plugins/lampe/allume2.bat';
	var texte = ' la salle de bain est allumé ';
  }
    if (data.val == "eteint1"){
	var process = '%CD%/plugins/lampe/eteint1.bat';
	var texte = ' la chambre est éteinte';
	}
	if (data.val == "eteint2"){
	var process = '%CD%/plugins/lampe/eteint2.bat';
	var texte = ' la salle de bain est éteinte';
  }
  if (data.val == "allumetout"){
	var process = '%CD%/plugins/lampe/allumett.bat';
	var texte = ' la salle de bain et la chambre sont allumé '
  }
  if (data.val == "eteinttout"){
	var process = '%CD%/plugins/lampe/eteinttt.bat';
	var texte = ' la salle de bain et la chambre sont éteint '
  }
  if (data.val == "menu"){
	var process = '%CD%/plugins/lampe/menu.bat';
	var texte = ' jouvre le menu domotique ';
  }
 var child = exec(process,
  function (error, stdout, stderr) {
    console.log(process);
   });
   var text = 'cest fait' + texte 

  callback({'tts': text});
  console.log(text);
  
}

Et voici le code arduino

/*
la page web propose 4 boutons: -"allume/eteint la chambre" selon l'etat de la pin
                               -"allume/eteint la salle de bain" selon l'etat de la pin
                               -"alume toute la chambre"
                               -"eteint toute la chambre"
Permet aussi la commande vocale avec sarah
 */

#include <SPI.h>
#include <Ethernet2.h>
byte gateway[] = {82,225,109,125};                        //82.225.109.125:3103
byte subnet[] = {255,255,255,0};
byte mac[] = { 0x90, 0xA2, 0xDA, 0x10, 0x04, 0x2D };
IPAddress ip(192,168,0,180); 
EthernetServer server(3103);
String readString;


boolean statled1 = 0;
boolean statled2 = 0;

void setup() {
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  pinMode(2, OUTPUT);
  pinMode(7, OUTPUT);
  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  Serial.print("server is at ");
}


void loop() {
  // Create a client connection
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {   
      if (client.available()) {
        char c = client.read();
     
        //read char by char HTTP request
        if (readString.length() < 100) {
          //store characters to string
          readString += c;
          //Serial.print(c);
         }

         //if HTTP request has ended
         if (c == '\n') {   

                 
           Serial.println(readString); //print to serial monitor for debuging


           if (readString.indexOf("?button1on") >0){
               digitalWrite(2, HIGH);
               statled1 = 1;
           }
           if (readString.indexOf("?button1off") >0){
               digitalWrite(2, LOW);
                 statled1 = 0;
           }
           if (readString.indexOf("?button2on") >0){
                digitalWrite(7, HIGH);
                  statled2 = 1;
           }
           if (readString.indexOf("?button2off") >0){
                digitalWrite(7, LOW);
                  statled2 = 0;
           }
            if (readString.indexOf("?button3on") >0){
               digitalWrite(2, HIGH);
               digitalWrite(7, HIGH);
                 statled1 = 1;
                 statled2 = 1;
            }
             if (readString.indexOf("?button3off") >0){
               digitalWrite(2, LOW);
               digitalWrite(7, LOW);
               statled1 = 0;
               statled2 = 0;
             }

           //debut page web
           client.println("HTTP/1.1 200 OK"); //send new page
           client.println("Content-Type: text/html");
           client.println();     
           client.println("<HTML>");
           client.println("<HEAD>");
           client.println("<meta name='apple-mobile-web-app-capable' content='yes' />");
           client.println("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />");
           client.println("<link rel='stylesheet' type='text/css' href='http://randomnerdtutorials.com/ethernetcss.css' />");
           client.println("<TITLE>Projet Domotique</TITLE>");
           client.println("</HEAD>");
           client.println("<BODY>");
           client.println("<H1>Projet Domotique</H1>");
           client.println("<hr />");  
           client.println("
");
           client.println("
");
           client.println("<a href=\"/?button1on\"\">Allume la chambre</a>");
           client.println("<a href=\"/?button1off\"\">Eteint la chambre</a>"); 
           client.println("
");     
           client.println("
"); 
           client.println("<a href=\"/?button2on\"\">Allume la salle de bain</a>"); 
           client.println("<a href=\"/?button2off\"\">Eteint la salle de bain</a>");   
           client.println("
");
           client.println("
");
           client.println("<a href=\"/?button3on\"\">Allume tout</a>");
           client.println("<a href=\"/?button3off\"\"> Eteint tout</a>
");
           client.println("
"); 
           client.println(" Etat pin 2 =");
           client.println(digitalRead(2));
           client.println("
");
           client.println(" la chambre est ");
           if(statled1 == 0){
            client.println("eteinte");
           }
           else if (statled1 == 1){
            client.println("allume");
           }
           client.println("
");
           client.println(" Etat pin 7 =");
           client.println(digitalRead(7));
           client.println("
");
           client.println("la salle de bain est ");
           if (statled2 == 0){
            client.println("eteinte");
           }
           else if (statled2 == 1){
            client.println("allume");
           }
           client.println("</BODY>");
           client.println("</HTML>");
           //fin page web


     
           delay(1);
           //stopping client
           client.stop();
           //controls the Arduino if you press the buttons
           
           
            //clearing string for next read
            readString="";  
       
          
         }
       }
    }
}
}

Voila je pense qu’avec le code vous comprendrez mieux ma situation.

Ce que je veux récupérer mon le code js Cest une variable, du genre un digitalread Ou un analogread que jaffiche sur ma page web arduino

corrigez votre post ci dessus et rajoutez les code tags autour du code:
[code]`` [color=blue]// votre code ici[/color] ``[/code].

ça doit ressembler à cela:// votre code ici
(faites aussi ctrl-T (PC) or cmd-T (Mac) dans l'IDE avant de copier le code pour qu'il soit indenté correctement)

la question est toujours pouvez vous changez le code arduino. votre Sarah n'est pas obligé d'appeler une page lisible par un humain... faites une requête sur votre arduino qui ne retourne que ce que vous voulez ou un XML que vous parserez.

Voila jai édite, pour indente je suis sur mon iPhone donc je le ferais en rentrant ce soir.
Oui je peux modifier le code arduino bien sûr mais je ne m’y connais pas beaucoup … j’avais penser à ca mais je ne sais pas du tout comment faire, JE pensais que aller chercher la valeur sur une page web serait plus simple. Savez vous comment faire pour créer cette requête et ensuite savoir la traiter ?

votre code regarde quelle URL est envoyée et exécute l’action correspondante. ce sont tous les

if (readString.indexOf("?button1on") >0)... // si l'URL contient button1on
if (readString.indexOf("?button1off") >0)... // si l'URL contient button1off
...

mais le code génère toujours la même page en fonction de quelques variables mises à jours par l’action.

C’est ce code qui bâtit la page avec les liens pour envoyer les commandes et l’état

//debut page web
           client.println("HTTP/1.1 200 OK"); //send new page
           client.println("Content-Type: text/html");
           client.println();     
           client.println("<HTML>");
           client.println("<HEAD>");
           client.println("<meta name='apple-mobile-web-app-capable' content='yes' />");
           client.println("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />");
           client.println("<link rel='stylesheet' type='text/css' href='http://randomnerdtutorials.com/ethernetcss.css' />");
           client.println("<TITLE>Projet Domotique</TITLE>");
           client.println("</HEAD>");
           client.println("<BODY>");
           client.println("<H1>Projet Domotique</H1>");
           client.println("<hr />");  
           client.println("
");
           client.println("
");
           client.println("<a href=\"/?button1on\"\">Allume la chambre</a>");
           client.println("<a href=\"/?button1off\"\">Eteint la chambre</a>"); 
           client.println("
");     
           client.println("
"); 
           client.println("<a href=\"/?button2on\"\">Allume la salle de bain</a>"); 
           client.println("<a href=\"/?button2off\"\">Eteint la salle de bain</a>");   
           client.println("
");
           client.println("
");
           client.println("<a href=\"/?button3on\"\">Allume tout</a>");
           client.println("<a href=\"/?button3off\"\"> Eteint tout</a>
");
           client.println("
"); 
           client.println(" Etat pin 2 =");
           client.println(digitalRead(2));
           client.println("
");
           client.println(" la chambre est ");
           if(statled1 == 0){
            client.println("eteinte");
           }
           else if (statled1 == 1){
            client.println("allume");
           }
           client.println("
");
           client.println(" Etat pin 7 =");
           client.println(digitalRead(7));
           client.println("
");
           client.println("la salle de bain est ");
           if (statled2 == 0){
            client.println("eteinte");
           }
           else if (statled2 == 1){
            client.println("allume");
           }
           client.println("</BODY>");
           client.println("</HTML>");
           //fin page web


     
           delay(1);
           //stopping client
           client.stop();

ce qu’il faudrait faire c’est si la requête est une URL spéciale par exempleif (readString.indexOf("?sarah") >0)...c’est générer une autre page plus simple à analyser avec Sarah, par exemple un XML

ah oui Cest une alternative. Mais comment faire analyser la page xml par Sarah ( du Java script ) EN passant par internet ? Ou EN passant par un autre moyen ?

Ah oui une requête http Cest bon JE fais ma petite recherche. JE vais continuer voir ce que je peux trouver JE vous tiens au courant merci !

relisez ma réponse 3 mais regardez “Comment analyser un fichier XML”

Bonjour bon jai fait quelque recherche mais je m'y perds un peu dans tout ça. SI j'arrive à créer une page xml, comment ca se passer la suite du côté js ?

Vous avez lu la doc?

Comment envoyer une requête HTTP

SARAH s'articule autour de l'API NodeJS, le tutorial "Demo 5" (en français) explique comment créer un plugin qui envoie une requête en utilisant l'API HTTP.

Ci-dessous un exemple tiré du site:

exports.action = function(data, callback, config, SARAH){
  var url = 'http://www.website.com/';
  // on charge le module 'request' pour NodeJS
  // c'est un module spécial qui vient de https://github.com/request/request
  var request = require('request');
  // on forge notre requête
  request({ 'uri' : url }, function (err, response, body){
    if (err || response.statusCode != 200) {
      return callback({'tts': "Action échouée"});
    }
    // Ici vous pouvez analyser le corps de la réponse et jouer avec
    // par exemple : var json = JSON.parse(body);
    callback({'tts': 'La réponse' });
  }
}

Dans cet exemple le corps de la réponse est du JSON, mais parfois il est nécessaire d'analyser une réponse qui est en XML grâce à node-xml2js ou un autre parser.

Un exemple pour du XML :

var xml2js = require('xml2js');
var parser = new xml2js.Parser({trim: true});
parser.parseString(body, function (err, xml) {
  var root = xml.root; // voir la documentation de node-xml2js
  // Rappel : le code est asynchrone
  // donc il faut appeler callback({ ... }) à un moment ou un autre
});